gpt4 book ai didi

c# - 什么会导致/如何防止 ContextSwitchDeadlock?

转载 作者:行者123 更新时间:2023-11-30 21:48:46 26 4
gpt4 key购买 nike

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

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

更新

自然地,顽固的过程在发布上述内容后立即“让我成为一个骗子”,因为我又得到了两对异常,这次是一对中的第二个错误消息 一个 第二个在第一个之后,而不是三个。如果我等待的时间足够长,也许第二个异常会在第一个异常之前发生。

最佳答案

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

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

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 秒,则对话框基本上是误报。如果您知道这是良性的,如“是的,它调用外部代码,是的,这有时可能需要 60 多秒”,那么您可以删除该图像下方的检查:

[ ] Break when this exception type is thrown

请注意,这不一定是异常,这更多的是 Visual Studio 只是对(对其)可疑行为发出警告信号。如果您知道这样做没问题,只需告诉它停止升起该标志即可。

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

关于c# - 什么会导致/如何防止 ContextSwitchDeadlock?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37443014/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com