我在Windows中有一个运行时间相当长的进程,它定期抛出一个"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...and,三秒钟后,如下所示:
Date: 05/25/2016 09:16:35:
Exception message: Cannot find table 0.
Exception Source: System.Data顺便说一句:至少它是一致的:我有三对这样的异常,每次第二对的日期是在第一次之后的3秒。
我以前有过这样或那样处理SQLCommand的CommandTimeout值(目前设置为360)的经验,它似乎有点像蒙着眼睛扔飞镖,甚至是黑魔法。是否有更好的方法来防止这种死锁?
我还有其他类似的方法不会造成这个问题;这些方法花费的时间更少。方法的持续时间(特别是运行查询所需的时间)似乎是“难点”。我改变不了--“事情就是这样”--那我还能做什么呢?
更新
当然,在发布上述内容后,顽固不化的过程“让我变成了骗子”,因为我得到了另外两对异常,这一次,第二次错误消息发生在第一次,而不是第三次。如果我等得够久,也许第二个异常会发生在第一个异常之前。
发布于 2016-05-25 16:42:37
ContextSwitchDeadlock是Visual中的“托管调试助手”,是Visual调试器在调试应用程序时向您提供额外帮助的许多工具之一。
我并不是百分之百肯定它用于确定何时触发的启发式方法,但我知道其中一些,这一点在工具窗口本身中也有描述:
当前线程当前没有运行代码,或者无法获得调用堆栈。
最后一部分通常是Visual的一部分,这通常是在托管(.NET)程序调用COM或P/Invoke时发生的事情。当此操作完成后,Visual不再能够查看程序并找出它正在做什么,而当这一过程超过60秒时,它就会发现有些地方出了问题。
如果您的程序正在执行上述操作,调用COM,或使用P/Invoke,或涉及外部非托管(.NET)代码的内容,而该外部代码需要超过60秒才能执行,则对话框基本上为假阳性。如果您知道这是良性的,如“是的,它调用外部代码,是的,这有时可能需要超过60秒”,那么您可以删除该图像中较低的检查:
引发此异常类型时中断
请注意,这不一定是一个例外,但这更多的是Visual,只是在可疑的(对它)行为上发出了红旗。如果你知道这没问题,就告诉它别再升起那面旗帜了。
请注意,这与问题中提到的其他实际异常没有任何关系,只有大的ContextSwitchDeadlock对话框。
https://stackoverflow.com/questions/37443014
复制相似问题