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

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

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...