我正在尝试以即发即忘的方式执行任务。
让我们看一下下面的代码。
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 任务并将其运行完成吗?
最佳答案
没有。您几乎不应该在 Web 应用程序中启动任何后台线程。 HTTP 被认为是无状态的,并且 Web 服务器在设计时就考虑到了这一点。
当一段时间内没有传入请求时,服务器可能会进入休眠状态。在此期间,所有后台执行都将停止,包括您的后台执行。当下一个请求到来时,它可能会也可能不会恢复。
或者当 IIS 决定定期回收您的应用程序域时,您的线程也会被终止。
如果您确实需要后台任务,请使用 Windows 服务或将其作为单独的控制台应用程序运行。
关于c# - 如果 Web api 返回响应,启动的任务会发生什么情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47682009/