【问题标题】:How to continue processing after return result from asp.net core controller method?从asp.net核心控制器方法返回结果后如何继续处理?
【发布时间】:2022-01-28 09:04:47
【问题描述】:

我有一些处理时间很长的过程,客户端不需要立即响应。我试过下面的代码没有成功。

    [HttpPost, Route("run")]
    public async Task Run()
    {
        _ = this.LongProcess().ConfigureAwait(false);
        return await Task.CompletedTask;
    }

该服务仍然需要一些时间,直到我的 LongProces 完成后再返回给客户。 如何让 Run 方法及时返回客户端?

【问题讨论】:

  • 异步 C# 功能并不意味着允许您在从方法返回后继续处理。您想要实现的是异步工作流,但您无法使用异步 C# 功能实现它。首先,您需要决定在 Web 应用程序中进行这项工作是否有意义,或者在其他地方进行是否更有意义。 Web 服务器擅长处理 HTTP 请求。它们不适合后台处理。它们的线程有限,会受到空闲关闭和随机应用程序池重启等影响。
  • 更有意义的做法是将长时间运行的处理转移到专用的后台服务中(可能使用 Windows 服务应用程序、Azure 函数/AWS Lambda 或其他形式的后台工作)。然后,您的 Web 应用程序可以通过 HTTP 请求接受作业详细信息,并以某种方式将其排入队列(可能使用数据库表、RabbitMQ、Azure 服务总线、AWS SQS 等)。然后,您的后台处理服务将从排队的工作中获取工作详细信息并进行处理,可能会在完成后向我们发送通知。

标签: asp.net asp.net-core asynchronous


【解决方案1】:

如何让Run方法及时返回客户端?

您需要一个基本的分布式架构。 I recommend:

  1. 持久存储系统,例如 Azure Queues 或 AWS Simple Queue Service。
  2. 独立处理器,例如 Azure Functions 或 AWS Lambdas。

然后,您的 API 将消息排入队列并返回:

[HttpPost, Route("run")]
public async Task Run()
{
  var message = new Message();
  await _queueService.EnqueueAsync(message);
  return;
}

独立处理器将消息出列并处理它们:

async Task HandleMessage(Message message)
{
  await LongProcess().ConfigureAwait(false);
}

【讨论】:

    猜你喜欢
    • 2017-07-29
    • 1970-01-01
    • 2020-05-07
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 2018-03-10
    • 1970-01-01
    相关资源
    最近更新 更多