【问题标题】:Best way of calling a long running process asynchronously in .net core web api在.net core web api中异步调用长时间运行进程的最佳方法
【发布时间】:2021-09-19 21:12:53
【问题描述】:

我正在尝试像这样从 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 属性)

【问题讨论】:

  • 您的问题是“如何在不阻塞 UI 的情况下从 ASP.NET Web API 调用长时间运行的任务?”
  • 好的,从阅读this开始。这是一系列帖子,详细解释了如何按照您的要求进行操作,并且以持久、可靠和 ASP.NET MVC 友好的方式进行。
  • 是的,那是真的.. 我的问题是如何在不阻塞 ui 的情况下从 web api 调用长时间运行的任务
  • 阅读我链接的系列文章。
  • Its async and UI never be blocked 你有一个负责分派请求的主线程(尽管 Kestrel 非常擅长使用它,因此净效果远不如 IIS 上的旧 ASP.Net 中那么明显)。因此,对于 Web 开发人员而言,避免阻塞它与桌面开发人员在 UI 线程方面的优先级相同。正确的方法是将其托管在不同的应用程序请求中,这些请求通过某种队列分派。具体细节很大程度上取决于您的环境、托管选项、预算等

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


【解决方案1】:

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

  1. Create a Durable Queue 用于放置您对长时间运行操作的请求。以 RabbitMQ 为例。或者,将您的请求写入数据存储/数据库中的 requests 表。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多