【问题标题】:DisconnectedContext was detected in LINQ To ActiveDirecory在 LINQ To ActiveDirecory 中检测到 DisconnectedContext
【发布时间】:2011-09-08 00:29:33
【问题描述】:

我正在使用来自 codeplex 的 LinqToActiveDirectory,当我使用 DirecotrySource 执行查询时出现以下错误:

检测到DisconnectedContext

消息:上下文 0x3c5050' 已断开连接。从当前上下文(上下文 0x3c4f98)释放接口。这可能会导致损坏或数据丢失。为避免此问题,请确保所有上下文/单元都保持活动状态,直到应用程序完全使用 RuntimeCallableWrapper 完成,这些 RuntimeCallableWrapper 代表了其中的 COM 组件。

这仅在调试时发生,如果我在方法的最后一个大括号上设置断点并按 F10 完成执行。在没有调试的情况下运行时,它按预期工作。 此外,如果我在最后一个大括号之前调用 GC.Collect(),我可以安全地退出。 我不想打电话给 GC,因为我知道最好让他去做他的工作。

我很乐意了解如何解决此问题。 谢谢,塔米尔。

【问题讨论】:

    标签: c# linq debugging com active-directory


    【解决方案1】:

    您在发布模式下仍然存在此问题,稍后会导致严重崩溃或数据损坏,但在调试模式下,它会触发试图帮助您解决问题的托管调试助手:http://msdn.microsoft.com/en-us/library/2c1czate.aspx

    一般来说,问题在于 COM 组件通常由特定线程拥有(取决于它支持托管的方式和创建位置)。最常见的情况是您在后台线程或线程池工作线程上创建了上下文,而现在该线程已经消失(这会终止 COM 单元或上下文,从而终止 COM 组件),然后您尝试使用 COM 对象。

    最终 System.DirectoryServices 使用 ADSI,它是一组 COM 组件。那么你是在线程之间传递东西,使用并行 LINQ,还是类似的东西?例如:如果您在后台线程上使用延迟执行 LINQ,然后将 IEnumerable 传递给前台线程,则查询的实际执行将在前台线程上发生......但如果您将 .ToList() 粘贴在那里,您将强制在后台线程上进行评估。

    请让我们知道这是否有帮助,如果您正在使用线程,我们可以提供更多指导。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      相关资源
      最近更新 更多