首页 > 解决方案 > 在.net core web api中异步调用长时间运行进程的最佳方法

问题描述

我正在尝试像这样从 web api 调用一个长时间运行的任务

    [HttpGet]
    public async Task<IActionResult> Get()
    {
        await Task.Run(()=>_report.TestFunctionAsync());
        
        return Accepted();

    }

这就是任务

    public async Task TestFunctionAsync()
    {
        ProcessStatus = 0;
        Task.Delay(TimeSpan.FromSeconds(30));
        ProcessStatus = 1;//wrting to DB
        Task.Delay(TimeSpan.FromSeconds(10));
        ProcessStatus = 2;//Fetching from Excel
        Task.Delay(TimeSpan.FromSeconds(20));
        ProcessStatus = 3;//Processing
        Task.Delay(TimeSpan.FromSeconds(50));
        ProcessStatus = 9;//Finished
    }

但是当我从 UI 的角度搜索时,我发现它的异步和 UI 永远不会被阻止。但它不是正确的方法。

因此,请提出一种更好的实施方式。还有什么方法可以了解异步任务的状态(使用 ProcessStatus 属性)

标签: c#asp.net-web-api.net-core

解决方案


由于 ASP.NET MVC 本身不提供处理长时间运行任务的能力,因此您必须创建一个外部解决方案。

  1. 创建一个持久队列,用于放置您对长时间运行的操作的请求。以 RabbitMQ 为例。或者,将您的请求写入数据存储/数据库中的请求表。

  2. 创建一个后端服务来执行您的长时间运行的任务。它应该从您的 Durable Queue 或数据库表中读取请求,并相应地处理它们。这可以是 Windows 服务、Linux 守护程序或 AWS Lambda 等。

  3. 创建通知机制,以便在任务完成时通知 UI,例如 Web 套接字连接或轮询。或者,在 ASP.NET Web API 上提供一个端点,允许您的网页检索任务状态。


推荐阅读