如何等待void async
方法完成其工作?等待無效異步方法
例如,我有一個函數象下面這樣:
async void LoadBlahBlah()
{
await blah();
...
}
現在我想確保一切都繼續在其他地方之前被加載。
如何等待void async
方法完成其工作?等待無效異步方法
例如,我有一個函數象下面這樣:
async void LoadBlahBlah()
{
await blah();
...
}
現在我想確保一切都繼續在其他地方之前被加載。
最好的做法是,以紀念功能async void
只有當它是射後不理方法,如果您想等待,則應將其標記爲async Task
。
如果您仍想等待的情況下,然後再包像這樣await Task.Run(() => blah())
如果您可以使用函數的簽名更改爲async Task
那麼你可以使用代碼提交here
你並不真的需要手工做任何事情,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
最好的解決方案是使用async Task
。您應該避免async void
由於幾個原因,其中之一是可組合性。
如果無法進行該方法返回Task
(例如,它是一個事件處理程序),那麼你可以使用SemaphoreSlim
有方法信號時,它即將退出。考慮在finally
區塊中執行此操作。
做一個AutoResetEvent,調用該函數,然後等待AutoResetEvent,然後在知道它完成時將其設置爲async void。
您也可以等待,從您的無效異步返回
我想等待'LoadBlahBlah任務()'來完成,而不是'胡說()' – MBZ
@MBZ更新答案 – Mayank
不幸的是異步void的方法做不暫停執行(與異步任務方法不同) – ghord