2012-10-25 38 views
0

它的東西之後,在UI線程中運行。我確定通過在等待之後爲UI線程和線程獲取Thread.CurrentThread.ManagedThreadId,並且UI線程變得無法響應。異步長阻塞方法等待周圍

那我該怎麼辦?我應該以傳統方式使用線程而不是依賴異步/等待?或者是否有辦法讓它在等待之後在新的非UI線程中運行?

+0

你可以用你的「長阻塞I/O語句」到另一個awaitable,任務,方法返回並等待呢? – n8wrl

回答

4

但問題是,它仍然在等待之後在UI線程中運行。

是的,它會。這是async/await整點的一半 - 您可以回到正確的上下文中。

這聽起來像你真的應該開始一個新的線程(或最好是,使用Task<T>)的後臺操作,如果你無法避免阻塞IO。然後你可以使用導致異步方法:

async Task Foo(...) 
{ 
    string result = await Task.Run(...); 
    // Now update the UI with the result 
} 
+0

我試過,它工作,但我更新該線程的UI元素(將項目添加到列表視圖),現在「調用線程無法訪問此對象,因爲不同的線程擁有它。」拋出異常。 – xander

+0

我通過在UI更新代碼之前添加this.Dispatcher.Invoke((Action)((=)=>修復了UI更新異常,希望我今天沒有更多的驚喜 – xander

+0

@xander:你爲什麼不這麼做根據我的建議?只*在另一個線程中同步位,並在完成那一點時返回到UI線程當然,您可以使用Dispatcher.Invoke,但目標是爲異步/等待在大多數情況下使這種情況變得不必要。 –