c# - .NET - 检测到 ContextSwitchDeadlock

标签 c# .net multithreading contextswitchdeadlock

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

基本上,看起来我的应用程序正在计算并且很长时间没有响应窗口,visual studio 将其关闭并报告可能出现死锁。

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

  1. 禁用 visual studio 调试器中的某些选项以检测死锁。对我不起作用,因为它仅用于调试目的。

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

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

最佳答案

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

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

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

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

关于c# - .NET - 检测到 ContextSwitchDeadlock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8106159/

相关文章:

c# - 允许在 SQL 事务期间读取?

c# - super 大国:仅当字符串开始一行时才将字符串与分词器匹配

.net - 监控文件 - 如何知道文件何时完成

c# - "ReferenceEquals(myObject, null)"比 "myObject == null"更好吗?

android - 我的广播接收器未在多线程应用程序中注册

java - 使用 WindowBuilder SWT 时 Java 中的多线程

c# - 有没有办法在 C# 中执行 SSRS 表达式

c# - 如何从派生类的实例中调用基类非默认构造函数?

c# - 如何在不同型号的 Controller 之间共享代码?

c++ - 如何使用成员函数创建 packaged_task?