c# – 信号量异常 – 将指定的计数添加到信号量将导致超出其最大计数

前端之家收集整理的这篇文章主要介绍了c# – 信号量异常 – 将指定的计数添加到信号量将导致超出其最大计数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_502_1@我一直在这个SemaphoreFullException安静一段时间.

总结一下..
我已经在IIS 7.5上使用ASP.NET v4.0框架应用程序池(集成)托管了一个应用程序.
我正在使用Windows身份验证通过域(isinrole)来验证我的用户.

我已经看到关于这个主题的所有其他线程,建议设置Pooling = False.
我不想这样做,我希望继续使用池,因为性能优势.

我正在使用Entity Framework 6来查询数据库,而不是将dbcontext“处置”到用户代码的任何地方.
看起来这个问题在DbConnectionPool代码中.

在任何给定的时刻,该错误随机发生.应用程序是否被使用无关紧要.有时,由于这个问题 – 我必须重新启动IIS,因为新用户停止获得身份验证.

到目前为止我已经尝试过

>检查是否正在处理DB事务对象.
>检查DBContext(ctx)是否被提前处理.
>检查应用程序生成(32/62位).在这种情况下 – 我以任何cpu模式构建应用程序,而我的服务器是64位.

注意:在我的应用程序中,我主要使用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,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连接最终在非托管数据库处理代码中,所以问题是,除非垃圾收集将上下文保持在主内存中,从而也阻止连接池的连接.所以迟早,在正确的条件下,你清空连接池并得到你的例外.

猜你在找的C#相关文章