如果web api返回响应,则启动的任务会发生什么

时间:2017-12-06 19:25:07

标签: c# async-await

我正试图以火灾和忘记方式执行任务。

让我们看下面的代码。

public IHttpActionResult Update(int id)
{
   var updatedResult = _updater.update(id);

   // fire and forget a task

   sendEmailToUser();

   return ok();

}

private async Task sendEmailToUser()
{
   var httpclient = new HttpClient();

   // assume the client is initiated with required url and other headers

  await httpclient.postasync("some url");

}

鉴于上面的代码,我可以安全地假设每当调用Update端点时,sendEmailToUser任务被触发并将运行完成吗?

2 个答案:

答案 0 :(得分:2)

没有。您几乎不应该在Web应用程序中启动任何后台线程。 HTTP被假定为无状态,并且Web服务器的设计考虑到了这一点。

如果在一段时间内没有传入请求,服务器可能会进入睡眠状态。在此期间,所有后台执行都将暂停,包括您拥有的那个。当下一个请求进入时,它可能会也可能不会恢复。

或者当IIS决定按计划回收您的App域时,您的线程也会被杀死。

如果您确实需要后台任务,请使用Windows服务或将其作为单独的控制台应用程序运行。

答案 1 :(得分:0)

在正常情况下,预计任务将完成运行是合理的。它会独立进行。

在这种情况下,您最关心的问题应该是Web API未被终止,而且任务不会引发异常。

但是如果OP需要100%确定,那么还有其他更安全的方法来编写代码。