【发布时间】: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