微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

原文地址:https://www.jb51.cc/csharp/93874.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐