Visual Studio:ContextSwitchDeadlock

问题描述 投票:142回答:8

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

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

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

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

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

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

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

我不知道这个过程中有什么东西与我以前做过的几十次大不相同。我以前看过这个错误,但从来没有一贯的。

任何想法,任何人?

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

c# sql-server visual-studio
8个回答
253
投票

ContextSwitchDeadlock并不一定意味着您的代码存在问题,只是存在潜在问题。如果你去菜单中的Debug > Exceptions并展开Managed Debugging Assistants,你会发现启用了ContextSwitchDeadlock。如果禁用此功能,当项目需要很长时间处理时,VS将不再警告您。在某些情况下,您可能有效地进行长时间运行。如果您正在进行调试并且在处理过程中已停止运行,那么它也会很有帮助 - 您不希望它在您有机会深入研究之前抱怨。


15
投票

正如Pedro所说,如果您正在逐步执行代码,那么调试器会出现问题,从而阻止了消息泵。

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

但是,如果您这样做,我建议您查看您的设计,以便您可以从UI线程执行处理,以便您的UI保持良好和快速。


13
投票

听起来你在应用程序的主UI线程上这样做。 UI线程负责在到达时抽取窗口消息,但由于您的数据库调用阻止了它,因此无法执行此操作。这可能会导致系统范围的消息出现问题。

你应该看看为长时间运行的操作产生一个后台线程,并为用户提供某种“我很忙”的对话框。


6
投票

如果您不想禁用此异常,则只需让应用程序每60秒至少抽一次消息。它将防止发生此异常。尝试偶尔调用System.Threading.Thread.CurrentThread.Join(10)。还有其他一些电话可以让消息消失。


1
投票

在某些情况下,上述解决方案很好,但是当您进行单元测试并且在解决方案未设置为Debug时尝试从“测试资源管理器”中“调试选定的测试”时,会出现另一种情况。

在这种情况下,您需要将解决方案从Release或其设置更改为Debug。如果这是问题,那么更改“ContextSwitchDeadlock”将无法真正帮助您。

我自己错过了,因为错误信息非常讨厌我没有检查显而易见的是Debug设置!


0
投票

在Visual Studio 2017西班牙语版本中。

“调试” - >“Windows” - >“例外设置”

并搜索“ContextSwitchDeadlock”。然后,取消选中它。或捷径

按Ctrl + d,E

最好。


0
投票

您可以通过取消选中contextswitchdeadlock来解决此问题

Debug-> Exceptions ... - >展开MDA节点 - >取消选中 - > contextswitchdeadlock


0
投票

在Visual Studio 2017中,取消选中ContextSwitchDeadlock选项:

调试> Windows>异常设置

enter image description here

在异常设置Windows中:取消选中ContextSwitchDeadlock选项

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.