首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理执行过程

处理执行过程
EN

Stack Overflow用户
提问于 2013-01-22 12:17:30
回答 1查看 255关注 0票数 1

几天前,我开始在我创建的c# winform应用程序中发现一个错误,声明

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

当我使用单独的线程运行exe进程以避免冻结ui时,就会出现这种情况。在一个发行版中,这个程序运行良好,正如预期的那样,但几乎不可能持续地调试我的程序(有时运行良好,而另一些则不太好)。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-22 12:37:51

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

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

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

代码语言:javascript
复制
<mdaConfig> 
  <assistants> 
    <contextSwitchDeadlock enable="false" /> 
  </assistants> 
</mdaConfig>

要在全球范围内关闭这一功能:

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

禁用此MDA的含义是,在发布应用程序之前,您会丢失一个发现bug的有用工具。当然,如果在未在调试器下运行时看到此死锁,则需要进行正常死锁分析。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14458371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档