我收到了一条无法解决的错误消息。它源自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)并在长时间运行操作期间定期泵送消息。
答案 0 :(得分:245)
ContextSwitchDeadlock
并不一定意味着您的代码存在问题,只是存在潜在问题。如果您转到菜单中的Debug > Exceptions
并展开Managed Debugging Assistants
,则会发现ContextSwitchDeadlock
已启用。如果禁用此功能,当项目需要很长时间处理时,VS将不再警告您。在某些情况下,您可能有效地进行长时间运行。如果您正在进行调试并且在处理过程中已停止运行,这也很有帮助 - 您不希望它在您有机会深入研究之前抱怨。
答案 1 :(得分:13)
正如Pedro所说,如果您正在逐步执行代码,那么调试器会出现问题,从而阻止了消息泵。
但是如果要在UI线程上执行长时间运行的操作,则调用Application.DoEvents(),它显式地对消息队列进行泵送,然后将控制权返回给当前方法。
但是,如果您这样做,我建议您查看您的设计,以便您可以从UI线程执行处理,以便您的UI保持良好和活泼。
答案 2 :(得分:11)
听起来你在应用程序的主UI线程上这样做了。 UI线程负责在到达时抽取窗口消息,但由于您的数据库调用阻止了它,因此无法执行此操作。这可能会导致系统范围的消息出现问题。
你应该看看为长时间运行的操作产生一个后台线程,并为用户提供某种“我很忙”的对话框。
答案 3 :(得分:6)
如果您不想禁用此异常,您只需让应用程序每60秒至少抽一次消息。它将防止发生此异常。 尝试偶尔调用System.Threading.Thread.CurrentThread.Join(10)。还有其他一些电话可以让消息消失。
答案 4 :(得分:2)
也有这个问题,我的解决方法是在我的线程中添加“await”:
Await Task.WhenAll(taskList.ToArray())
Await Task.Run(myAction)
答案 5 :(得分:1)
上述解决方案在某些情况下表现良好,但还有另一种情况,即当您进行单元测试并尝试“调试所选测试”时,会发生这种情况。当解决方案未设置为Debug时,从Test Explorer中。
在这种情况下,您需要将解决方案从Release或其设置更改为Debug。如果这是问题,那么改变" ContextSwitchDeadlock"不会真的帮到你。
我自己错过了,因为错误信息非常糟糕,我没有检查显而易见的调试设置!
答案 6 :(得分:0)
在Visual Studio 2017西班牙语版本中。
“Depurar” - > “Ventanas” - > “ConfiguracióndeExcepciones”
并搜索“ContextSwitchDeadlock”。 然后,取消选中它。 或快捷方式
控制+ d,E
最佳。
答案 7 :(得分:0)
您可以通过从
取消选中contextswitchdeadlock来解决此问题Debug-> Exceptions ... - >展开MDA节点 - >取消选中 - > contextswitchdeadlock
答案 8 :(得分:0)
在Visual Studio 2017中,通过以下方式取消选中ContextSwitchDeadlock选项:
调试> Windows>异常设置
在“异常设置”窗口中:取消选中ContextSwitchDeadlock选项
答案 9 :(得分:0)
我遇到此错误,并将查询切换为异步(await(...)。ToListAsync())。现在一切都好。