2013-01-22 83 views
1

几天前,我开始变得与C#WinForm应用程序错误我已经创建,指出处理执行的进程

的CLR一直无法从COM上下文0x278f58转换为COM上下文0x2790c8持续60秒。拥有目标上下文/公寓 的线程很可能是在不抽取Windows消息的情况下执行非抽取等待或处理非常长的运行操作。

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

我已经试过实施这个过程迫使BackgroundWorker使用多个Google搜索结果同步解决这个错误的问题,但使我的程序以意想不到的方式工作(文本框在exe结束之前填充导致错误的数据)。

我读过这个错误只会发生在生产中,而不是在发布..所以我的问题是我应该只是试图忍受这种烦恼或是他们的非背景解决方案?如果需要任何代码示例,我可以提供,但我不相信这是必要的

+1

这是一个调试器警告。没有调试器,你不会得到它。虽然肯定会有一些可能会从用户那里得到*完全相同的投诉。他们不会明白为什么你的UI会冻结,或者为什么程序不能停止,并且不会响应输入。 –

回答

1

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

由于许多COM组件都是STA,并且Windows窗体中的主线程也是STA,所以这是一个警告,表明您正在阻止。这可能是因为你花费时间逐步浏览代码来拖延消息循环。

要为单个项目关掉这个功能,下面的内容添加到您的应用程序配置文件:

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

要全局关掉这个功能:

  • 点击调试菜单上视觉工作室。
  • 选择例外选项(调试 - >例外)。
  • “例外”窗口将打开。
  • 展开“Managed Debugging Assistants”节点。
  • 取消选中ContextSwitchDeadlock选项下的引发列。
  • 单击确定并关闭例外窗口。

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

+0

感谢这个有用的见解..我认为对于我的特殊情况,我将尽可能多地解决这个问题,尽可能地尽量减少实际死锁的风险。 – Sayse