Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么会导致/如何防止ContextSwitch死锁?_C#_Windows Services_Sqlcommand_Command Timeout_Contextswitchdeadlock - Fatal编程技术网

C# 什么会导致/如何防止ContextSwitch死锁?

C# 什么会导致/如何防止ContextSwitch死锁?,c#,windows-services,sqlcommand,command-timeout,contextswitchdeadlock,C#,Windows Services,Sqlcommand,Command Timeout,Contextswitchdeadlock,我在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 respond

我在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
…然后三秒钟后:

Date: 05/25/2016 09:16:35: 
Exception message: Cannot find table 0.
Exception Source: System.Data
顺便说一句:至少它是一致的:我有三对这样的异常,每次第二个异常都是在第一个异常的三秒钟之后进行的

我以前有过这样或那样Jimming SQLCommand的CommandTimeout值(当前设置为360)的经验,这似乎有点像蒙着眼睛扔飞镖,甚至是黑魔法。有没有更好的方法来防止这种僵局

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

更新
很自然,在发布上述内容之后,这个顽固的过程“让我变成了一个骗子”,因为我又收到了两对异常,这一次,这对异常中的第二个err msg出现在第一个而不是三个之后的第二个。如果我等待的时间足够长,第二个异常可能会在第一个异常之前发生。

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

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

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

最后一部分通常会使Visual Studio出错,这通常是托管(.NET)程序调用COM或p/Invoke时发生的情况。完成此操作后,VisualStudio将无法再查看该程序并了解它正在执行的操作,而当此操作花费超过60秒时,它会认为出现了问题

如果您的程序正在执行上述操作、调用COM、使用p/Invoke或涉及外部非托管(.NET)代码的操作,并且此外部代码的执行时间超过60秒,则该对话框基本上是误报。如果您知道这是良性的,如“是的,它调用外部代码,是的,这有时可能需要60秒以上”,那么您可以删除该图像下方的复选框:

[]引发此异常类型时中断

请注意,这并不一定是例外,这更像是VisualStudio对可疑行为的警告。如果你知道这没关系,就告诉它停止升起那面旗


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

只是为了确认一下,您只在调试时得到ContextSwitchDeadlock?是的,但到目前为止我只做了这些。我还没有安装该服务,所以它只在调试模式下运行(从Visual Studio运行)。另外两个异常,超时和关于未知表的异常,可能是您的代码的真正问题,但我建议您在另一个问题中发布这些异常,以及触发它们的代码。但是,对于上下文切换死锁通知,请参阅我的答案,了解它的含义以及如何消除它;是的,它还做了相当长的Excel互操作工作,所以这可能就是问题所在。我不时会遇到例外情况,但它们似乎并没有真正引起问题(我不知道为什么——从字面上看,它们对我来说似乎很有问题)。正如我在对你的问题的评论中所说,我的回答只详细说明了上下文切换死锁,既然你说你有Excel interop,我几乎百分之百肯定这就是原因,但是,你可以要求Visual Studio停止警告你,假设你不认为它花费了太长的时间。但是,您应该在单独的问题中发布其他异常和触发它们的代码,以便可以更详细地查看它们。如您所愿: