【问题标题】:Solve DisconnectedContext in Visual Studio在 Visual Studio 中解决 DisconnectedContext
【发布时间】:2011-02-01 09:24:08
【问题描述】:

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

但是,当我在弹出窗口出现时查看所有线程时,我没有找到类似的东西。 (而且我一点也不觉得奇怪)。

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

【问题讨论】:

    标签: c# .net visual-studio debugging


    【解决方案1】:

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

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

    最佳建议:如果可以,请不要使用 CLR/互操作。下一个最佳建议:使用 COM+ 对您的互操作进行进程隔离,以便 CLR 可以存在于一个永不终止线程的进程中(使用持久线程池或等效的)。下一个最佳建议:与我一起继续向 Microsoft 介绍他们的互操作的设计级问题,并希望他们解决它。

    【讨论】:

      【解决方案2】:

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

      忽略警告可能会偶尔产生非常难以解决线程争用错误的问题。每周只有一次出现微妙错误的事情。查看您的代码,注意它所抱怨的对象是如何创建的。

      【讨论】:

      • 我不想忽略警告(用 CTRL+ALT+E 删除它就可以了)。问题是我不知道在哪里看,因为应用程序很大,并且警告没有告诉我为什么它会触发。
      • 好吧,我试图解释为什么触发它以及在哪里寻找原因。失败鲸鱼的声音。如果您无法解决问题,请尝试向参与此项目的人员寻求帮助。
      猜你喜欢
      • 2017-02-28
      • 2015-11-28
      • 1970-01-01
      • 2011-01-04
      • 2019-05-05
      • 1970-01-01
      • 1970-01-01
      • 2019-10-28
      • 1970-01-01
      相关资源
      最近更新 更多