不等待的后果

Consequences of not awaiting

我有一个 .net webapi,其中包含一些用于发送电子邮件的代码。

public async Task CheckOut(CheckOutData checkOutData){
     ...
     ...
     ...
     //What are the risks if I remove the await
     await SendEmail(checkOutData);
     ...
     ...
}

public async Task SendEmail(CheckOutData checkOutData)
{
  try{
  ...
  ...
  ...
  }
  catch (exception ex){
     //log Error
  }
}

我在 SendEmail 代码中设置了日志记录。我的问题是,如果我删除 await,如果在 SendEmail 完成之前执行完成,是否有可能线程被杀死并且电子邮件不被发送?

如果我删除 await 是否安全?我愿意接受异常会被吞下,它会被记录下来。

除非整个过程停止,否则将发送电子邮件。

关于线程,我们可以把SendEmail分为两部分:

SendEmail
   // Code that will run on the calling thread. This is the code that will prepare the data and send it to the hardware.
   // Code that will run on a thread-pool thread. This is the  code that will run after the hardware will finish sending the message.

该方法的第一部分将保留原始线程,因此线程在完成之前不会被释放。第二部分将 运行 在线程池线程上,因此原始线程是否被释放并不重要。

编辑: 如果您在 IIS 上托管您的应用程序,则应用程序域可能会被回收,因此不建议 运行 代码持续请求。这篇博客中对此进行了描述 post https://blog.stephencleary.com/2012/12/returning-early-from-aspnet-requests.html

在自托管情况下,此功能不存在 ()。因此,您可以 运行 使用 Task.Run 一个漫长的 运行ning 过程 Long running task in ApiController (using WebAPI, self-hosted OWIN)

所以在自托管的情况下你可以避免等待。您不会等待的方法部分不会被杀死。与上述 Task.Run 案例一样。

希望对您有所帮助