c# - 如果 Web api 返回响应,启动的任务会发生什么情况

标签 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 任务并将其运行完成吗?

最佳答案

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

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

或者当 IIS 决定定期回收您的应用程序域时,您的线程也会被终止。

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

关于c# - 如果 Web api 返回响应,启动的任务会发生什么情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47682009/

相关文章:

c# - 使用带有表单编码参数和 header 的 C# httpclient 发布

node.js - 在 try/catch block 中等待两个 promise 导致 "Unhandled promise rejection"

c# - 默认(可空(类型))与默认(类型)

c# - Unity 将嵌套字典序列化为 JSON

c# - 在无服务器上下文中,C# async/await 有什么好处?

asp.net-mvc-4 - await 语句返回时异步方法不会继续

.net - Task.Run 作为反模式?

C# 错误 CS0117 : 'Array' does not contain a definition for

c# - RazorEngine:不解析出现在小于号 ("<"之后的变量)

c# - 为什么要使用事件来实现我可以使用委托(delegate)执行的操作?