小编典典

Visual Studio:上下文切换死锁

all

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

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

来自 VS 的第一条消息是一个弹出框,上面写着:“没有为任何调用堆栈帧加载任何符号。无法显示源代码。” 当它被点击时,我得到:“
ContextSwitchDeadlock was detected ”,以及下面复制的一条长消息。

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

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

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

表单上没有花哨的小玩意或小工具。

我不知道这个过程中有什么与我之前做过的几十次有很大不同的地方。我以前见过这个错误,但从来没有一致的基础。

任何想法,任何人?

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


阅读 243

收藏
2022-06-30

共1个答案

小编典典

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

如果你禁用它,当项目需要很长时间来处理时,VS
将不再警告你。在某些情况下,您可能有效地进行了长时间运行的操作。如果您正在调试并且在处理过程中停止在线,这也很有帮助 -
在您有机会深入研究问题之前,您不希望它抱怨。

2022-06-30