2009-06-15 31 views
2

我使用LinqToActiveDirectory CodePlex从和当我使用DirecotrySource执行查询我发现了以下错误:DisconnectedContext在LINQ检测要ActiveDirecory

DisconnectedContext检测

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

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

我很乐意了解如何解决这个问题。坦米尔谢谢你。

回答

1

你仍然在释放模式这个问题,它会导致大崩溃或数据损坏以后,但在调试模式下它会触发正试图帮助您解决问题的托管调试助手:http://msdn.microsoft.com/en-us/library/2c1czate.aspx

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

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

请让我们知道这是否有帮助,如果您使用线程,我们可以提供更多的方向。