【问题标题】:Running awaitable task asynchronously in asp.net在 asp.net 中异步运行等待任务
【发布时间】:2020-04-24 21:40:23
【问题描述】:

我的控制器中有以下操作:

[HttpPost("run")]
public Task<object> Run([FromBody] ResearchRequest researchRequest)
{
   researchService.RunAsync(researchRequest);
   return new{ queued = true   };
}

控制器需要处理需要几分钟的任务。
这是释放researchService.RunAsync 处理其工作的正确方法吗?

或者有没有更好的方法。

谢谢

【问题讨论】:

  • 一般来说,这是一个正确的做法。但是,您还应该考虑其他一些事情。例如。如果有人多次发布相同的ResearchRequest 应该如何处理?检查 researchRequest 是否已经排队,而不是再排队一个没有意义吗?此外,我看不出您在这里需要async 的原因。如果理解正确,你想要的是一个即发即弃的动作,你不需要控制器等待提交researchRequest的过程完成。正确吗?
  • 你已经标记了你的方法 async 但你没有 awaiting 任何东西。
  • @Christos 谢谢。 (异步是错误的)。我将如何检查是否有任务已经在运行(我需要一些来自队列任务的数据上下文以确保它正在运行)?谢谢。
  • @fatnjazzy 你可以在 researchService 中添加一个标志,当你进入 RunAsync 时设置为 true ,当你即将返回时设置为 false ,然后在执行前快速检查 Run 操作方法运行异步
  • 相关:How should I run a long-running task in ASP.NET? 简短回答:你不应该。将长时间运行的逻辑卸载到单独的服务。

标签: c# asp.net asp.net-mvc async-await


【解决方案1】:

如果你想检查一个进程是否已经在运行,你可以在服务器端的某个地方(在数据库中的任务等)将它标记为正在进行中,然后在显示 UI 时调用服务器上的方法检查您的进行中标志的状态。

这样 UI 可以离开该页面并返回仍然看到进程已启动

【讨论】:

    【解决方案2】:

    可以这样做如果RunAsync正在发出I/O请求,但你不会返回Task

    [HttpPost("run")]
    public object Run([FromBody] ResearchRequest researchRequest)
    {
       researchService.RunAsync(researchRequest);
       return new{ queued = true   };
    }
    

    这将开始在同一个线程上运行RunAsync,就像任何其他方法一样。在RunAsync 中的第一个await 作用于不完整的Task 时,RunAsync 将返回它自己的不完整Task,此时控制返回到您的Run 操作并返回您的object .您无需等待RunAsync 进行的任何 I/O 操作。

    如果RunAsync 由于 CPU 计算(而不是 I/O)而需要很长时间,那么这对您没有任何帮助,因为请记住,它开始在同一个线程上运行。您必须在另一个线程上启动它,您可以使用Task.Run

    [HttpPost("run")]
    public Task<object> Run([FromBody] ResearchRequest researchRequest)
    {
       Task.Run(() => researchService.RunAsync(researchRequest));
       return new{ queued = true   };
    }
    

    但是!

    在这两种情况下,ASP.NET 都不知道RunAsync 正在后台运行。如果 IIS 应用程序池因任何原因被关闭或回收,则该作业将在中途终止。请注意,默认情况下,IIS 配置为在 20 分钟没有 HTTP 请求进入后关闭应用程序池。

    如果这对您来说是不可接受的,那么您最好将作业写入数据库或其他东西的队列中,然后在 Windows 服务中进行后台处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-06
      • 2012-11-15
      • 1970-01-01
      • 2014-03-18
      • 2016-07-24
      • 1970-01-01
      • 2019-05-07
      相关资源
      最近更新 更多