Visual Studio: ContextSwitchDeadlock

我一直收到一个我无法解决的错误消息。它起源于Visual Studio或调试器。我不确定最终的错误条件是在VS中,调试器中,我的程序中,还是数据库中。

这是一个Windows应用程序,不是网页应用程序。

VS的第一个消息是一个弹出框,上面写着: "任何调用堆栈帧都没有加载符号。源代码无法显示。” 当点击离开,我得到:

. "检测到ContextSwitchDeadlock",以及下面的长消息

错误出现在扫描数据表的循环中。对于每一行,它使用表中的键(HIC #)值作为SqlCommand的参数。该命令用于创建一个SqlDataReader,返回一行。数据进行比较。如果检测到错误,则将一行添加到第二个数据表。

错误似乎与程序运行的时间(即60秒后)有关,而不是发现了多少错误。我不认为这是记忆问题。在循环中没有声明变量。唯一创建的对象是SqlDataReaders,它们在Using结构中。Add System.GC.Collect()没有效果。

db是同一台笔记本电脑上的SqlServer站点。

表单上没有花哨的小发明或小玩意。

在这个过程中,我没有发现任何与我以前做过的几十次有很大不同的地方。我以前见过这种错误,但从来没有一致的情况。

有人有什么想法吗?

完整错误 CLR在60秒内无法从COM上下文0x1a0b88转换到COM上下文0x1a0cf8。拥有目标上下文/公寓的线程很可能要么在执行一个非抽取等待,要么在不抽取Windows消息的情况下处理一个非常长时间运行的操作。这种情况通常会对性能产生负面影响,甚至可能导致应用程序变得无响应或内存使用量随着时间的推移不断累积。为了避免这个问题,所有单线程公寓(STA)线程都应该使用泵送等待原语(例如CoWaitForMultipleHandles),并在长时间运行的操作期间定期泵送消息

172482 次浏览

听起来好像你在应用程序的主UI线程上做了这件事。UI线程负责在到达时泵送窗口消息,但因为你的消息在数据库调用中被阻塞,所以无法这样做。这可能会导致系统范围内的消息出现问题。

您应该考虑为长时间运行的操作生成一个后台线程,并在它发生时为用户提供某种“我很忙”对话框。

ContextSwitchDeadlock并不一定意味着你的代码有问题,只是有潜在的问题。如果你进入菜单中的Debug > Exceptions并展开Managed Debugging Assistants,你会发现ContextSwitchDeadlock已启用。

如果你禁用此功能,VS将不再在物品处理时间较长时发出警告。在某些情况下,您可以有效地拥有一个长时间运行的操作。如果您正在调试并且在处理过程中停止了一行,那么它也很有帮助——您不希望在有机会深入研究问题之前它就抱怨。

如果你不想禁用这个异常,你所需要做的就是让你的应用程序至少每60秒抽取一次消息。它将防止这种异常的发生。 试着偶尔调用System.Threading.Thread.CurrentThread.Join(10)。您还可以执行其他调用来让消息泵浦

正如Pedro所说,如果您在逐级遍历代码,那么调试器会阻止消息泵。

但是如果在UI线程上执行长时间运行的操作,则调用Application.DoEvents(),它会显式地抽取消息队列,然后将控制权返回给当前方法。

然而,如果你正在这样做,我建议你看看你的设计,这样你就可以在UI线程之外执行处理,这样你的UI就会保持漂亮和时髦。

上述解决方案在某些情况下很好,但在另一种情况下,当您正在进行单元测试时,当您的解决方案未设置为调试时,您试图从测试资源管理器中“调试选定的测试”时,会发生这种情况。

在这种情况下,您需要将解决方案从发布或其他设置更改为调试。如果这就是问题所在,那么更改“ContextSwitchDeadlock”并不能真正帮助您。

我自己错过了这个,因为错误消息是如此令人讨厌,我没有检查明显的事情,这是调试设置!

在Visual Studio 2017西班牙语版本。

"Depurar" -> "Ventanas" -> "Configuración de Excepciones"

和搜索“ContextSwitchDeadlock”。 然后,取消勾选。 或快捷键

Ctrl + D, E

最好的

你可以通过取消检查contextswitchdeadlock from来解决这个问题

调试- >异常…->扩容MDA节点-> uncheck -> contextswitchdeadlock

在Visual Studio 2017中,通过以下方式取消了ContextSwitchDeadlock选项:

调试> Windows >异常设置

enter image description here

在例外设置Windows中:取消选中“ContextSwitchDeadlock”选项

enter image description here

我得到这个错误,并将查询切换到async (await(…). tolistasync())。现在都好了。

也有这个问题,我的解决方案是添加“等待”;致我的线程:

Await Task.WhenAll(taskList.ToArray())
Await Task.Run(myAction)