2012-04-27 39 views
0

我有一些代碼,一直工作正常了很長時間讓別人記錄在我的應用程序:的DirectorySearcher的FindAll SearchResultCollection計數拋出收到COMException

private Employee Authenticate(string userName, string password) { 
    DirectorySearcher search = new DirectorySearcher(_rootDirectory); 
    search.Filter = "(&(objectClass=user)(SAMAccountName=" + userName + "))"; 
    try { 
    SearchResultCollection results = search.FindAll(); 
    if (0 < results.Count) { 
     // the rest of my code 
     // that returns an employee 
     // if the password matches 
    } 
    } catch (Exception err) { 
    MessageBox.Show(err.Message, "ActiveDir.cs ADWrapper::AuthenticateUser Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
    return null; 
} 

最近,代碼已經拋出COMException作爲儘快測試results.Count值(SearchResultCollection不爲空)。

微軟文檔沒有指出Count應該拋出任何類型的異常。

在調試我的代碼時,我可以將斷點放在上面的條件上,將鼠標懸停在上面,並查看是否存在異常。

screenshot of exception

如果我使用F10讓調試帶我去catch條件或等待幾秒鐘斷點時,results.Count變量變成有效且包含一個整數值。

我猜FindAll方法正在一個線程中執行,並且我正在線程完成之前檢查結果。

有沒有辦法告訴當FindAll()已完成或已我只是發現了某種新的bug聲息作爲的Active Directory更新的結果?

+0

什麼是HRESULT? http://msdn.microsoft.com/en-us/library/system.exception.hresult.aspx – 2012-04-27 22:13:01

回答

1

這是一個調試器工件。調試表達式在進程內的輔助線程上執行。事實上,這是一個不同的線程與執行代碼的線程可能有副作用。例如,明顯的例子是在其吸氣劑中使用的屬性。

不那麼明顯的是任何與COM相關的東西,比如Active Directory。 COM爲線程安全的COM服務器實現線程安全。這在調試器線程上無法正常工作,創建服務器的線程被凍結。加上其他任何可能出錯的地方,比如沒有代理/存根需要編組調用等等。

您沒有真正的問題。

+0

謝天謝地。我以爲我將不得不重寫我的'Active Directory'例程來使用某種'WaitOne'方法。 – jp2code 2012-04-29 02:49:35

0

我發現了OP的確切行爲。我的問題是我的過濾器有一個錯誤 - 當發生這種情況時,我沒有發現FindAll()引發的錯誤,但隨後嘗試訪問.Count在調試器中給出錯誤...幾秒鐘後,.Count返回零。

相關問題