首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么会导致/如何防止ContextSwitchDeadlock?

什么会导致/如何防止ContextSwitchDeadlock?
EN

Stack Overflow用户
提问于 2016-05-25 16:34:10
回答 1查看 780关注 0票数 2

我在Windows中有一个运行时间相当长的进程,它定期抛出一个"ContextSwitchDeadlock“异常:

我还操纵了我的服务,向自己发送电子邮件,详细说明遇到的例外情况。我得到:

代码语言:javascript
复制
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,三秒钟后,如下所示:

代码语言:javascript
复制
Date: 05/25/2016 09:16:35: 
Exception message: Cannot find table 0.
Exception Source: System.Data

顺便说一句:至少它是一致的:我有三对这样的异常,每次第二对的日期是在第一次之后的3秒。

我以前有过这样或那样处理SQLCommand的CommandTimeout值(目前设置为360)的经验,它似乎有点像蒙着眼睛扔飞镖,甚至是黑魔法。是否有更好的方法来防止这种死锁?

我还有其他类似的方法不会造成这个问题;这些方法花费的时间更少。方法的持续时间(特别是运行查询所需的时间)似乎是“难点”。我改变不了--“事情就是这样”--那我还能做什么呢?

更新

当然,在发布上述内容后,顽固不化的过程“让我变成了骗子”,因为我得到了另外两对异常,这一次,第二次错误消息发生在第一次,而不是第三次。如果我等得够久,也许第二个异常会发生在第一个异常之前。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-25 16:42:37

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

我并不是百分之百肯定它用于确定何时触发的启发式方法,但我知道其中一些,这一点在工具窗口本身中也有描述:

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

最后一部分通常是Visual的一部分,这通常是在托管(.NET)程序调用COM或P/Invoke时发生的事情。当此操作完成后,Visual不再能够查看程序并找出它正在做什么,而当这一过程超过60秒时,它就会发现有些地方出了问题。

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

引发此异常类型时中断

请注意,这不一定是一个例外,但这更多的是Visual,只是在可疑的(对它)行为上发出了红旗。如果你知道这没问题,就告诉它别再升起那面旗帜了。

请注意,这与问题中提到的其他实际异常没有任何关系,只有大的ContextSwitchDeadlock对话框。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37443014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档