我正在使用codeplex中的LinqToActiveDirectory,当我使用DirecotrySource执行查询时,我收到以下错误:
检测到DisconnectedContext
消息:上下文0x3c5050'已断开连接。从当前上下文释放接口(上下文0x3c4f98)。这可能导致损坏或数据丢失。为了避免这个问题,请确保所有上下文/公寓都保持活动状态,直到应用程序完全使用代表其中的COM组件的RuntimeCallableWrappers完成。
这只在调试时发生,如果我在方法的最后一个花括号上设置断点并按F10完成执行。当没有调试运行时它按预期工作。 另外,如果我在最后一个花括号之前调用GC.Collect(),我可以安全地退出。 我不想打电话给GC,因为我知道留下他做他的工作会更好。
我很乐意知道如何解决这个问题。 谢谢,Tamir。
答案 0 :(得分:1)
在发布模式下仍然存在此问题,以后会导致严重崩溃或数据损坏,但在调试模式下,它会触发试图帮助您解决问题的托管调试助手:http://msdn.microsoft.com/en-us/library/2c1czate.aspx
一般来说,问题是COM组件通常由特定线程拥有(取决于它如何支持托管以及创建它的位置)。最常见的情况是您在后台线程或线程池工作线程上创建了上下文,现在该线程已经消失(这会杀死COM公寓或上下文,从而导致COM组件被杀死),之后您尝试使用COM对象。
最终,System.DirectoryServices使用ADSI,它是一组COM组件。所以你在线程之间传递东西,使用Parallel LINQ,或类似的东西?例如:如果你在后台线程上使用LINQ的延迟执行然后将IEnumerable传递给前台线程,那么查询的实际执行将发生在前台线程上...但是如果你在那里粘贴.ToList(),你将强制评估后台主题。
如果您有任何帮助,请告知我们,如果您使用线程,我们可以提供更多指导。