我花了差不多兩天的時間閱讀異步/等待教程和答案Stackoverflow和試圖瞭解C#中的異步和並行執行。儘管如此,我還是無法讓它與我的代碼一起工作。InvalidCastException當使用任務返回值
我需要什麼
執行通過PrincipalSearcher一個Active Directory搜索異步無阻塞的WPF界面。
實施
類 _activeDirectoryprotected async void SearchButtonClick()
{
Task<PrincipalSearchResult<Principal>> searchTask = Task.Run(() => _activeDirectory.FindGroup(searchText.Text));
PrincipalSearchResult<Principal> searchResult = await searchTask;
foreach (var foundGroup in searchResult) /*exception thrown here*/
{
...
}
}
:
public PrincipalSearchResult<Principal> FindGroup(String pattern)
{
...
PrincipalSearchResult<Principal> searchResult = searcher.FindAll();
return searchResult;
}
問題
await
似乎並沒有等待完成任務。searchTask.IsCompleted
在等待線之後是真實的,但它不能是因爲幾乎沒有時間完成,如果我同步運行它,搜索需要大約5秒。- 如果在foreach循環的開始拋出的異常:
System.InvalidCastException occurred HResult=-2147467262
Message=Unable to cast COM object of type 'System.__ComObject' to interface type 'IDirectorySearch'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{109BA8EC-92F0-11D0-A790-00C04FD8D5A8}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)). Source=System.DirectoryServices StackTrace: at System.DirectoryServices.SearchResultCollection.get_SearchObject()
InnerException:
思考
- 我發現的是,這種異常的無效的SynchronizationContext是相關的,但我不知道看看這可能發生在這裏。我還在幾行代碼上打印了Thread.CurrentThread.ManagedThreadId,它總是返回相同的ID。
- 我也讀過,異步方法不應該返回
void
但Task<T>
,但我不認爲這是相關的,因爲沒有人異步使用SearchButtonClick()。而且如果這個問題甚至相關的話,Task.Run()
可能會返回一個Task。整個主題對我來說依然模糊不清。
問題
- 爲什麼
await
不會等待任務完成? - 異常的原因是什麼?
http://stackoverflow.com/questions/18110738/passing-collection-from-backgroundworker-dowork-to-backgroundworker-completed-an –
@Gosha_Fighten我已經試過'PrincipalSearchResult信息搜索結果=(PrincipalSearchResult )等待searchTask ;'。這並沒有解決問題。 –
mrplow