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

C# 信号量异常-将指定计数添加到信号量将导致其超过最大计数,c#,asp.net-mvc,entity-framework,linq-to-entities,iis-7.5,C#,Asp.net Mvc,Entity Framework,Linq To Entities,Iis 7.5,一段时间以来,我一直有这种信号量lexception 总而言之。。 我在IIS 7.5上托管了一个应用程序,其中包含ASP.NET v4.0 framework应用程序池(集成)。 我正在使用windows身份验证通过域(isinrole)对我的用户进行身份验证 我已经看到了关于这个主题的所有其他线程,建议将Pooling设置为False。 我不想这样做,因为性能优势,我希望继续使用池 我使用EntityFramework6查询数据库,而不是在用户代码中的任何地方“处理”dbcontext。 问

一段时间以来,我一直有这种信号量lexception

总而言之。。 我在IIS 7.5上托管了一个应用程序,其中包含ASP.NET v4.0 framework应用程序池(集成)。 我正在使用windows身份验证通过域(isinrole)对我的用户进行身份验证

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

我使用EntityFramework6查询数据库,而不是在用户代码中的任何地方“处理”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, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.TimerQueueTimer.CallCallback()
   at System.Threading.TimerQueueTimer.Fire()
   at System.Threading.TimerQueue.FireNextTimers()

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

我认为这可能是问题的解决方案:-正如您在这里看到的,在DbContext的生命周期结束时,注意对其进行处理是非常重要的


请记住,Db连接以非托管Db处理代码结束,因此问题在于,除非垃圾收集处理它在主存中保持休眠的上下文,否则它也会阻塞连接池中的连接。因此,在正确的条件下,您迟早会清空连接池并获得异常。

我也有同样的问题,原因是我在执行
.Dispose()在关闭连接之前,我就是这样解决的:

我有两个
.Dispose()的实例-一个在SqlDataAdapter中,另一个在SqlCommand中,然后关闭连接并获取错误。

刚刚删除了
.Dispose()来自我的SqlCommand和我的SqlDataAdapter,没有更多错误!我希望这能有所帮助。

在我的例子中,问题是我在调试时停止了应用程序。应用程序进行了大量异步调用

因此,我通过命令提示符或PowerShell重置了我的IIS服务器:
iisreset
,它成功了

编辑:查看IIS Express的@aaroncatlin注释


我最近遇到了一个类似的信号量lim问题。下面是有问题的代码,在
semaphoreSlime.Release()
中引发了相同的异常。这里的原因是
WaitAsync
由于令牌取消而失败,因此
Release()
将导致超出允许的最大计数。因此,解决方案可以是在调用
Release()
之前添加一些防御代码,例如,检查
WaitAsync
期间是否发生异常,检查允许的帐户是否超过允许的计数

try
{
   await semaphoreSlim.WaitAsync(cancellationToken);
   // do some work
}
catch (OperationCanceledException)
{
   // exception handling
}
finally
{
   semaphoreSlim.Release();
}

我们也看到了这一点——你找到解决办法了吗?谷歌搜索没有取得任何进展,只是提出了一个模糊的(而且不是100%有效的)建议关闭连接池,这对我们来说是不可扩展的。我没有一个解决方案,只有一些观察结果。DBContext不打算像这样使用。DBContext不是线程安全的。如何管理DBContent的线程方面?注意:IIS调用可能涉及不同的线程。我不能强调足够考虑搬到短暂的环境。每一个线程至少1个。为迟来的回复道歉。我们不得不使用ADO/Bulk insert/update选项来加速查询并消除这个错误。也许这就是问题的原因。然而,我不得不从EF6DBContext转换到ADO,并且能够解决错误。标记链接以供将来参考。谢谢我目前正在寻找解决这个问题的办法。很高兴你能解决它。谢谢你的反馈。下次遇到这个问题时,我会尝试一下。我有相同的原因,但
iisreset
没有为我解决它。相反,我必须在系统托盘中找到IIS Express,右键单击并退出。之后,当我启动另一个调试会话时,问题消失了。我在调试过程中停止应用程序后遇到了这个问题。当时只有一个同步数据库查询发生。