【发布时间】:2017-07-12 20:06:15
【问题描述】:
我试图向一位同事解释为什么async void 函数不好并且不会捕获异常,但事实证明我可能没有正确理解它们。我们有一段代码看起来有点像这样:
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 网络配置很大,但自定义错误是
<customErrors mode="Off" /> -
查看我的答案
标签: c# asp.net-mvc asynchronous async-await