什么会导致/如何阻止ContextSwitchDeadlock?

时间:2016-05-25 16:34:10

标签: c# windows-services sqlcommand command-timeout contextswitchdeadlock

我在Windows服务中有一个相当长时间运行的进程,它定期抛出一个" ContextSwitchDeadlock"例外:

enter image description here

我还操纵我的服务,向自己发送电子邮件,其中包含遇到异常的详细信息。我明白了:

Date: 05/25/2016 09:16:32:
Exception message: Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
Exception Source: .Net SqlClient Data Provider

......然后三秒钟后:

Date: 05/25/2016 09:16:35: 
Exception message: Cannot find table 0.
Exception Source: System.Data
顺便说一下:至少它是一致的:我有三对这些例外,每次第二个例子都是在第一个例子之后三秒钟。

我之前有过使用SQLCommand的CommandTimeout值(目前设置为360)这样或那样的经验,看起来有点像投掷飞镖蒙上眼睛甚至是黑魔法。有没有更好的方法来防止这种死锁?

我有其他非常类似的方法,不会导致这个问题;那些花费的时间更少。方法的持续时间(具体来说,查询运行所花费的时间长度)似乎是"摩擦。"我不能改变它 - "它就是它" - 那我还能做什么呢?

更新

当然,顽固的过程"骗了我一个骗子"在发布上述内容之后,由于我还有另外两对例外,这一次与第一个错误的msg一起发生一个第二个而不是三个。如果我等待足够长的时间,也许第二个例外将在第一个例外之前发生。

1 个答案:

答案 0 :(得分:3)

ContextSwitchDeadlock是Visual Studio中的“托管调试助手”,是Visual Studio调试器在调试应用程序时为您提供额外帮助的众多工具之一。

我不是100%肯定它用什么样的启发式来确定何时触发但我知道一些,这也在工具窗口本身中描述:

  

当前线程当前没有运行代码,或者无法获取调用堆栈。

最后一部分通常是Visual Studio,这通常是托管(.NET)程序调用COM或P / Invoke时发生的事情。完成此操作后,Visual Studio将无法再查看该程序并弄清楚它正在做什么,当这种情况发生时间超过60秒时,它会发现出现问题。

如果您的程序正在执行上述操作,调用COM,或使用P / Invoke,或涉及外部非托管(.NET)代码的内容,并且此外部代码需要超过60秒才能执行,那么对话框基本上是假阳性。如果您知道这是良性的,例如,“是的,它会调用外部代码,是的,这有时可能需要60秒以上”,然后您可以删除该图像中较低的检查:< / p>

  

[]抛出此异常类型时中断

请注意,它不一定是异常,这更像是Visual Studio在可疑(对它)行为上引发红旗。如果你知道这没关系,那就告诉它停止提高那个标志。

请注意,这与您在问题中提到的其他实际例外无关,只与大型ContextSwitchDeadlock对话框有关。