.NET - 检测到ContextSwitchDeadlock

时间:2011-11-12 17:26:02

标签: c# .net multithreading contextswitchdeadlock

我在c#(.net 3.5 cp,vs2010)中有一个类,它执行复杂的计算,这通常需要很长时间。一分钟后,抛出异常,检测到ContextSwitchDeadlock。异常是本地化的,我的非英语语言所以我不能复制粘贴,但意思如下: ¨ CLR模块无法从上下文COM ...转换到上下文COM ... 60秒。拥有目标上下文/公寓的子进程可能正在进行非抽空等待或处理非常长时间运行的操作而不会抽取Windows系统消息。

基本上,看起来我的应用程序是计算并且长时间没有响应窗口,而visual studio关闭它并报告可疑的死锁。

我正在尝试做一些研究并找到两个解决方案:

  1. 在visual studio debbuger中禁用某些选项以检测死锁。 Dost不适合我,因为它仅用于调试目的。

  2. 调用一些DoEvents方法,但它适用于Windows窗体而不是WPF,而且我使用的是WPF。

  3. 还有建议创建单独的线程,但我是完全新的线程,不知道我该怎么办。有什么建议吗?

1 个答案:

答案 0 :(得分:40)

这只是来自托管调试助手(MDA)的警告。您的代码违反了单线程单元(STA)线程的相当严格的要求,它们不允许长时间阻塞。警告是真实的,阻止UI线程很容易导致死锁。但是在你的情况下解释很简单,它只是紧张性的,因为它忙于计算,而不是因为它实际上被阻止了。 MDA无法区分。

您可以使用Debug + Exceptions关闭警告,打开Managed Debugging Assistants节点并取消选中ContextSwitchDeadlock。

这仍然会给用户留下一个桌面上的窗口,这个窗口对世界来说已经死了,并不是一个很棒的用户体验。它可能会产生副作用,导致其他程序在向顶层窗口发送消息时无响应。

您确实需要使用线程来真正解决此问题。看看BackgroundWorker,它在MSDN Library和许多其他地方都有详细记录。