我試圖向同事解釋爲什麼async void
函數很糟糕,並且異常不會被捕獲,但事實證明我可能不會理解它們是正確的。我們有一段代碼,看起來有點像這樣:在發送結果之前,MVC函數返回但等待異步函數
public ActionResult EmailCandidates(List<string> identityTokens, string subject, string content)
{
// generate list of recipients here
SendEmail(recipients, subject, content); //not awaited
return new AjaxResponse { // AjaxResponse is a wrapper around JSONResponse
IsSuccess = true,
Data = recipients.Select(r=>r.Name)
};
}
private async void SendEmail(List<EmailAddress> recipients, string subject, string content)
{
await Task.Delay(10000); // simulate async send email
throw new Exception(); // manually added
}
我所期待的,而我試圖解釋的是,如果SendEmail
函數拋出一個異常,將無法正確抓到,因爲主功能EmailCandidates
已經返回給客戶端。只是這不會發生。上面的代碼執行完全相同的順序我想到:
- 一個呼叫從客戶機向
EmailCandidates
SendEmail
叫- 電子郵件是同步發送(通過異步等待在這裏模擬)
- 控制返回到
EmailCandidates
,並返回執行
,然後它會有點奇怪:
- 在這一點上,我希望得到客戶端的響應,但我不這樣做,即使
EmailCandidates
返回 - 10秒後的異常被拋出
- 異常是由全球陷入錯誤處理器,現在客戶端會收到一個500錯誤(不出所料)
那麼,爲什麼即使EmailCandidates
又回來了,沒有得到發送到客戶端的響應。如何知道等待異步SendEmail
函數?
快速問題,你有什麼配置這是你的webconfig? –
Zinov
@Zinov web配置非常大,但自定義錯誤是' –
Anduril
檢查波紋管我的回答 – Zinov