我一直有这个SemaphoreFullException安静了一段时间。
总结一下
我已经在带有ASP.NET v4.0框架“应用程序池”(集成)的IIS 7.5上托管了一个应用程序。
我正在使用Windows身份验证通过域(isinrole)对我的用户进行身份验证。
我已经看到了有关此主题的所有其他线程,建议在其中设置Pooling = False。
我不想这样做,由于性能方面的优势,我想继续使用池化。
我正在使用Entity Framework 6来查询数据库,而没有在用户代码中的任何地方“放置” dbcontext。
看起来问题出在DbConnectionPool代码中。
错误在任何给定的时间随机发生。是否正在使用该应用程序都没有关系。有时,由于这个问题-我必须重新启动IIS,因为新用户停止获得身份验证。
到目前为止,我已经尝试过:
注意:在我的应用程序中,我主要使用linq-to-EF对象来查询数据库。
Exception: System.Threading.SemaphoreFullException
Message: Adding the specified count to the semaphore would cause it to exceed its maximum count.
StackTrace: at System.Threading.Semaphore.Release(Int32 releaseCount)
at System.Data.ProviderBase.DbConnectionPool.CleanupCallback(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.TimerQueueTimer.CallCallback()
at System.Threading.TimerQueueTimer.Fire()
at System.Threading.TimerQueue.FireNextTimers()
在这方面的任何帮助将不胜感激。
最佳答案
我认为这可能是解决问题的方法:http://www.davepaquette.com/archive/2013/03/27/managing-entity-framework-dbcontext-lifetime-in-asp-net-mvc.aspx-如您所见,当DbContext的生命周期结束时,务必要小心处理。
请记住,Db连接最终会以非托管的db处理代码结束,因此问题在于,除非垃圾回收将上下文保持在休眠状态,否则它会一直驻留在主内存中,从而也阻止了连接池中的连接。因此,在适当的条件下,迟早要清空连接池并获得异常。
关于c# - 信号灯异常-将指定的计数添加到信号灯将导致其超过其最大计数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30013179/