我一直收到一个我无法解决的错误消息。它起源于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.


当前回答

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

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

其他回答

在Visual Studio 2017西班牙语版本。

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

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

Ctrl + D, E

最好的

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

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

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

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

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

调试> Windows >异常设置

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

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