我有一個async不返回任何數據的方法:public async Task MyAsyncMethod(){ // do some stuff async, don't return any data}我從另一個返回一些數據的方法中調用此方法:public string GetStringData(){ MyAsyncMethod(); // this generates a warning and swallows exceptions return "hello world";}在MyAsyncMethod()不等待的情況下進行調用會在Visual Studio中發出“ 因為未等待此調用,因此當前方法會在調用完成之前繼續運行 ”警告。在該警告的頁面上,它指出:僅當您確定不想等待異步調用完成并且被調用的方法不會引發任何異常時,才應考慮禁止顯示警告。我確定我不想等待通話結束。我不需要或沒有時間。但是通話可能會引發異常。我已經幾次遇到這個問題,并且我確定這是一個常見的問題,必須有一個通用的解決方案。如何安全地調用異步方法而不等待結果?更新:對于建議我只是等待結果的人,這是響應我們Web服務(ASP.NET Web API)上的Web請求的代碼。在UI上下文中等待將保持UI線程空閑,但是在Web請求調用中等待將等待Task完成,然后再響應請求,從而無故增加了響應時間。
3 回答

一只名叫tom的貓
TA貢獻1906條經驗 獲得超3個贊
如果要“異步”獲取異常,則可以執行以下操作:
MyAsyncMethod().
ContinueWith(t => Console.WriteLine(t.Exception),
TaskContinuationOptions.OnlyOnFaulted);
這將使您可以處理“主”線程以外的線程上的異常。這意味著您不必“等待” MyAsyncMethod()來自調用線程的調用MyAsyncMethod;但是,仍然允許您執行例外操作-但僅當發生例外時。
更新:
從技術上講,您可以執行以下操作await:
try
{
await MyAsyncMethod().ConfigureAwait(false);
}
catch (Exception ex)
{
Trace.WriteLine(ex);
}
...如果您需要專門使用try/ catch(或using),這將很有用,但我發現它ContinueWith要明確一些,因為您必須知道什么ConfigureAwait(false)意思。
- 3 回答
- 0 關注
- 1659 瀏覽
添加回答
舉報
0/150
提交
取消