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

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

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

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

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

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

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

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

有人有什么想法吗?

Full error Text: The CLR has been unable to transition from COM context 0x1a0b88 to COM context 0x1a0cf8 for 60 seconds. The thread that owns the destination context/apartment is most likely either doing a non pumping wait or processing a very long running operation without pumping Windows messages. This situation generally has a negative performance impact and may even lead to the application becoming non responsive or memory usage accumulating continually over time. To avoid this problem, all single threaded apartment (STA) threads should use pumping wait primitives (such as CoWaitForMultipleHandles) and routinely pump messages during long running operations.


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

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


ContextSwitchDeadlock并不一定意味着您的代码有问题,只是有潜在的问题。如果您在菜单中打开调试>异常,并展开托管调试助手,您将发现启用了ContextSwitchDeadlock。

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


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


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

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

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


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

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

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


在Visual Studio 2017西班牙语版本。

"调试" -> "窗口" -> "异常设置"

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

Ctrl + D, E

最好的


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

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


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

调试> Windows >异常设置

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


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


也有这个问题,我的修复是添加“等待”到我的线程:

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