小编典典

Visual Studio:ContextSwitch死锁

c#

我收到了我无法解决的错误消息。它源自Visual Studio或调试器。我不确定最终的错误情况是在VS,调试器,我的程序还是数据库中。

这是Windows应用程序。不是网络应用。

VS发出的第一条消息是一个弹出框,上面显示:“没有为任何调用堆栈框架加载任何符号。无法显示源代码。” 单击该按钮后,我得到:“
检测到ContextSwitchDeadlock ”,以及下面复制的一则长消息。

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

该错误似乎与过程运行多长时间(即60秒后)有关,而不是与发现多少错误有关。我不认为这是内存问题。循环内未声明任何变量。唯一创建的对象是SqlDataReaders,它们位于Using结构中。添加System.GC.Collect()无效。

该数据库是同一台便携式计算机上的SqlServer站点。

表单上没有精美的小玩意或小工具。

我不知道此过程中的任何事情与我之前数十次所做的事情有很大不同。我之前已经看过错误,但是从来没有看到一致的错误。

有什么想法吗?

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


阅读 430

收藏
2020-05-19

共1个答案

小编典典

ContextSwitchDeadlock并不一定意味着你的代码中有一个问题,只是有一个潜在的。如果转到Debug > Exceptions菜单中并展开Managed Debugging Assistants,则会发现ContextSwitchDeadlock已启用。如果禁用此选项,则当项目需要很长时间才能处理时,VS将不再发出警告。在某些情况下,您可能会有效地长时间运行。如果您正在调试并且在处理过程中停在一条线上,这也很有用-
在您有机会深入探讨问题之前,您不希望它抱怨。

2020-05-19