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

一只名叫tom的貓
TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超3個(gè)贊
如果要“異步”獲取異常,則可以執(zhí)行以下操作:
MyAsyncMethod().
ContinueWith(t => Console.WriteLine(t.Exception),
TaskContinuationOptions.OnlyOnFaulted);
這將使您可以處理“主”線程以外的線程上的異常。這意味著您不必“等待” MyAsyncMethod()來自調(diào)用線程的調(diào)用MyAsyncMethod;但是,仍然允許您執(zhí)行例外操作-但僅當(dāng)發(fā)生例外時(shí)。
更新:
從技術(shù)上講,您可以執(zhí)行以下操作await:
try
{
await MyAsyncMethod().ConfigureAwait(false);
}
catch (Exception ex)
{
Trace.WriteLine(ex);
}
...如果您需要專門使用try/ catch(或using),這將很有用,但我發(fā)現(xiàn)它ContinueWith要明確一些,因?yàn)槟仨氈朗裁碈onfigureAwait(false)意思。
- 3 回答
- 0 關(guān)注
- 1657 瀏覽
添加回答
舉報(bào)
0/150
提交
取消