.NET – 检测到ContextSwitchDeadlock

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

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

我试图做一些研究,找到两个解决方案:

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

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

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

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

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

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

您确实需要使用线程来真正解决此问题。 看看BackgroundWorker,它在MSDN Library和许多其他地方都有很好的文档。