处理执行过程

时间:2013-01-22 12:17:30

标签: c# winforms multithreading process

几天前,我开始使用c#winform应用程序出错,我一直在创建说明

  

CLR无法从COM上下文0x278f58转换到COM上下文0x2790c8 60秒。拥有目标上下文/公寓的线程   很可能是在没有抽取Windows消息的情况下进行非抽空等待或处理非常长时间运行的操作。

当我使用单独的线程来运行exe进程以避免冻结ui时,就会发生这种情况。在发布版本中,这个程序运行正常并且符合预期,但几乎不可能一致地调试我的程序(有时候工作正常,其他不太好)。

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

要全局关闭此功能:

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

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

相关问题