2012-11-29 178 views
80

如何等待void async方法完成其工作?等待無效異步方法

例如,我有一個函數象下面這樣:

async void LoadBlahBlah() 
{ 
    await blah(); 
    ... 
} 

現在我想確保一切都繼續在其他地方之前被加載。

回答

97

最好的做法是,以紀念功能async void只有當它是射後不理方法,如果您想等待,則應將其標記爲async Task

如果您仍想等待的情況下,然後再包像這樣await Task.Run(() => blah())

51

如果您可以使用函數的簽名更改爲async Task那麼你可以使用代碼提交here

2

你並不真的需要手工做任何事情,await關鍵字暫停功能執行,直到blah()回報。

private async void SomeFunction() 
{ 
    var x = await LoadBlahBlah(); <- Function is paused 
    //do more stuff when LoadBlahBlah() returns 
} 

private async Task<T> LoadBlahBlah() 
{ 
    return await blah(); <- function is paused 
} 

T是對象的類型blah()回報

你真的不能await一個void功能,使LoadBlahBlah()不能void

+0

我想等待'LoadBlahBlah任務()'來完成,而不是'胡說()' – MBZ

+0

@MBZ更新答案 – Mayank

+5

不幸的是異步void的方法做不暫停執行(與異步任務方法不同) – ghord

17

最好的解決方案是使用async Task。您應該避免async void由於幾個原因,其中之一是可組合性。

如果無法進行該方法返回Task(例如,它是一個事件處理程序),那麼你可以使用SemaphoreSlim有方法信號時,它即將退出。考慮在finally區塊中執行此操作。

2

做一個AutoResetEvent,調用該函數,然後等待AutoResetEvent,然後在知道它完成時將其設置爲async void。

您也可以等待,從您的無效異步返回