什么 cause/how 可以防止 ContextSwitchDeadlock?

What would cause/how can I prevent a ContextSwitchDeadlock?

我在 Windows 服务中有一个相当长的 运行ning 进程,它会定期抛出 "ContextSwitchDeadlock" 异常:

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

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)的经验,这看起来有点像蒙着眼睛扔飞镖,甚至是黑魔法。有没有更好的方法来防止这种死锁?

我有其他非常相似的方法不会导致这个问题;那些花费更少的时间。该方法的持续时间(具体来说,查询到 运行 所需的时间长度)似乎是 "the rub." 我无法更改它 - "it is what it is" - 那么我还能做什么?

更新

自然地,顽固的过程 "made a liar out of me" 在发布上面的内容之后,因为我又得到了两对异常,这次是一对中的第二个错误消息 one 第一个之后的第二个而不是三个。如果我等的时间足够长,也许第二个异常会在第一个异常之前发生。

ContextSwitchDeadlock 是 Visual Studio 中的 "Managed debugging assistant",并且是 Visual Studio 调试器在调试应用程序时为您提供额外帮助的众多工具之一。

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

The current thread is not currently running code or the call stack could not be obtained.

这最后一部分通常会出错 Visual Studio,这通常发生在托管 (.NET) 程序调用 COM 或 P/Invoke 时。完成此操作后,Visual Studio 将无法再查看程序并弄清楚它在做什么,而当这恰好花费超过 60 秒时,它会认为出现了问题。

如果您的程序正在执行上述操作,调用 COM,或使用 P/Invoke,或涉及外部非托管 (.NET) 代码,并且此外部代码执行时间超过 60 秒,那么对话基本上是误报。如果您知道这是良性的,例如"yes, it calls external code, and yes, this may sometimes take more than 60 seconds",那么您可以删除该图像下方的支票:

[ ] Break when this exception type is thrown

请注意,这不一定是异常,这更多的是Visual Studio只是对可疑行为发出警告信号。如果你知道这没问题,就告诉它停止升旗。

请注意,这与您在问题中提到的其他真正的异常无关,只有大的 ContextSwitchDeadlock 对话框。