1

几天前,我开始在创建的 ac#winform 应用程序中出现错误,说明

CLR 在 60 秒内无法从 COM 上下文 0x278f58 转换到 COM 上下文 0x2790c8。拥有目标上下文/单元的线程很可能要么进行非泵送等待,要么处理非常长时间运行的操作而不泵送 Windows 消息。

当我使用单独的线程运行 exe 进程以避免冻结 ui 时,就会发生这种情况。在发布版本中,该程序运行良好且符合预期,但几乎无法始终如一地调试我的程序(有时工作正常,其他人不太好)..

我尝试通过BackgroundWorker使用多个谷歌搜索的答案强制 a 同步来实现此过程,这解决了此错误的问题,但使我的程序以意想不到的方式工作(在 exe 完成之前填充的文本框导致错误数据)。

我已经读过这个错误只会发生在生产中而不是发布中。所以我的问题是我应该试着忍受这种烦恼还是他们的非后台解决方案?如果需要任何代码示例,我可以提供,但我认为没有必要

4

1 回答 1

1

托管调试助手 (MDA) 告诉您单线程单元 (STA) COM 线程在 60 秒内没有响应消息。STA COM 是通过消息传递完成的。如果 MDA 已打开,则会发生此异常,默认情况下,在调试器下运行时会出现此异常。MDA 用于检测具有预定义超时的死锁,并且它仅在您在 VS 调试器下运行程序时才有效。

由于许多 COM 组件是 STA 并且 Windows 窗体中的主线程也是 STA,因此这是您正在阻止的警告。这可能是因为您通过花时间单步执行代码来停止消息循环。

要为单个项目关闭此功能,请将以下内容添加到您的应用程序配置文件中:

<mdaConfig> 
  <assistants> 
    <contextSwitchDeadlock enable="false" /> 
  </assistants> 
</mdaConfig>

要全局关闭此功能:

  • 单击 Visual Studio 中的“调试”菜单。
  • 选择异常选项(调试 -> 异常)。
  • 例外窗口将打开。
  • 展开“托管调试助手”节点。
  • 取消选中Throw列下的ContextSwitchDeadlock选项。
  • 单击确定并关闭例外窗口。

禁用此 MDA 意味着您失去了在发布应用程序之前发现错误的有用工具。当然,如果你在调试器下没有运行时看到这个死锁,那么你需要做一个正常的死锁分析。

于 2013-01-22T12:37:51.863 回答