不等待的后果
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 案例一样。
希望对您有所帮助
我有一个 .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 案例一样。
希望对您有所帮助