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


当前回答

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

其他回答

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

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

调试> Windows >异常设置

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

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

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

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

在Visual Studio 2017西班牙语版本。

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

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

Ctrl + D, E

最好的