【问题标题】:Handling executing processes处理正在执行的进程
【发布时间】:2013-01-22 12:17:30
【问题描述】:

几天前,我开始在我创建的一个 c# winform 应用程序中遇到一个错误,指出

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

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

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

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

【问题讨论】:

  • 这是一个调试器警告。如果没有调试器,您将无法获得它。尽管您肯定会从用户那里得到完全相同的相同投诉。他们不会完全理解您的 UI 为何冻结或程序无法停止且无法响应输入的原因。

标签: c# winforms multithreading process


【解决方案1】:

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

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

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

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

要全局关闭此功能:

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

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

【讨论】:

  • 感谢您提供有用的见解。我认为对于我的特殊情况,我将尽可能地解决这个问题,我已经尽可能地降低了实际死锁的风险现在..
猜你喜欢
  • 2018-11-21
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
  • 2016-10-13
  • 2014-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多