2009-06-15 27 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(),那麼您將強制在後臺線程上進行評估。

請讓我們知道這是否有幫助,如果您使用線程,我們可以提供更多的方向。