在Visual Studio中解决DisconnectedContext

时间:2011-02-01 09:24:08

标签: c# .net visual-studio debugging

当我使用Visual Studio运行我的应用程序时,我总是得到一个DisconnectedContext(一个托管调试助手)。鉴于Google和docs,当从其他线程调用STA上的COM对象时,就会发生这种情况。

然而,当我看到弹出窗口中的所有线程时,我找不到这样的东西。 (而且我根本找不到任何奇怪的东西)。

关于如何找到DisconnectedContext的方式的一些想法?

2 个答案:

答案 0 :(得分:9)

在寻找相同答案的同时找到了这个,我想我会添加评论......

在使用CLR对象通过进程间互操作(在瞬态线程上)的任何多线程应用程序中,此错误几乎是不可避免的。问题是CLR具有非确定性的对象清理(可能是RCW,对底层COM对象具有线程关联性)。你无法告诉运行时清理线程上创建的对象(至少不在线程上创建另一个非确定性的清理句柄);这是互操作机制的设计限制。鉴于此,没有办法安全地退出已创建任何CLR对象的线程而不会出现此错误。

最佳建议:如果可以提供帮助,请不要使用CLR / interop。下一个最好的建议:使用COM +来处理 - 隔离你的互操作,因此CLR可以存在于永远不会终止线程的进程中(使用持久性线程池或等效的)。下一个最好的建议:和我一起继续用他们的互操作告诉微软这个设计级别的问题,希望他们能解决它。

答案 1 :(得分:3)

这是一个非常严重的警告,不要忽视它。方案是您在线程上创建了一个COM对象并退出该线程。但是你继续使用那个对象。 COM负责处理宣布自己不是线程安全的对象(也称为单元线程),它会自动将对该对象的任何调用封送到创建它的线程。当该线程不再存在时,这不起作用。

忽略警告可能会偶尔产生并且非常难以解决线程争用错误。每周只发生一次巧妙错误的东西。检查您的代码,注意它所抱怨的对象是如何创建的。