信号量异常 - 将指定的计数添加到信号量将导致它超过其最大计数

问题描述 投票:16回答:3

我一直在安静这个SemaphoreFullException。

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

我已经看过这个主题的所有其他主题,建议设置Pooling = False。我不想那样做,因为性能优势,我想继续使用池。

我正在使用Entity Framework 6来查询数据库,我没有在用户代码中的任何地方“处理”dbcontext。看起来这个问题出现在DbConnectionPool代码中。

错误在任何给定时刻随机发生。无论是否使用该应用程序都无关紧要。有时,由于此问题 - 我必须重新启动IIS,因为新用户停止进行身份验证。

到目前为止我尝试过的:

  • 检查是否正在处理数据库事务对象。
  • 检查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, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.TimerQueueTimer.CallCallback()
   at System.Threading.TimerQueueTimer.Fire()
   at System.Threading.TimerQueue.FireNextTimers()

在这方面的任何帮助将不胜感激。

c# asp.net-mvc entity-framework linq-to-entities iis-7.5
3个回答
5
投票

我认为这可能是问题的解决方案:http://www.davepaquette.com/archive/2013/03/27/managing-entity-framework-dbcontext-lifetime-in-asp-net-mvc.aspx - 正如你在那里看到的那样,在生命周期结束时必须小心处理DbContext。

请记住,Db连接最终会出现在非托管数据库处理代码中,因此问题是除非垃圾收集处理它在主内存中保持睡眠的上下文,从而也阻止了连接池的连接。所以迟早,在适当的条件下,您清空连接池并获得异常。


11
投票

就我而言,问题是我在调试时停止了应用程序。该应用程序正在进行大量的异步调用。

所以我重置我的IIS服务器:iisreset通过命令提示符或PowerShell,它工作。

编辑:查看IIS Express的@aaroncatlin评论


1
投票

我有同样的问题,因为我在关闭连接之前做.Dispose();这是我解决它的方式:

我有两个.Dispose();实例 - 一个在SqlDataAdapter中,另一个在一个SqlCommand中,然后关闭连接并得到错误。刚从我的SqlCommand和我的SqlDataAdapter中删除了.Dispose();,没有更多的错误!我希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.