作者:北京草舞945share | 来源:互联网 | 2023-06-27 11:16
c#
在 .Net 5 Web API 中,我想运行一个发送批量电子邮件和 SMS 的后台任务。我知道我可以创建一个从 BackgroundService 继承的服务,然后将它添加到 Startup.ConfigureServices 方法中的 DI 容器,如下所示:
services.AddHostedService();
但这会立即运行服务 - 即在应用程序启动时。我想在 API 收到来自前端的请求时运行该服务。即在控制器的动作方法中。
我一直在查看 Microsoft 文档中的“带有托管服务的后台任务”,如果我没记错的话,这就是我需要做的(查看标题为“在后台任务中使用范围服务”的部分):
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-5.0&tabs=visual-studio
这样对吗?我是否基本上需要创建两个服务,一个执行实际工作,另一个调用执行实际工作的服务?我在正确的道路上吗?
谢谢
回答
您需要查看“排队后台服务”,您可以在其中向它提交“作业”,它会在后台队列中执行这些作业。
工作流程是这样的:
- 调用者向服务发送带有一些参数的请求
- 服务生成“作业”对象并通过 202(已接受)响应立即返回 ID
- 服务将此作业放入由
BackgroundService
- 调用者可以使用此作业 ID 查询作业状态并获取有关已完成多少以及剩余多少的信息
- 服务完成作业,将作业置于“已完成”状态并返回等待队列以产生更多作业
这是关于它如何工作的一个非常冗长的解释:https : //stackoverflow.com/a/63429262/1204153
这是我不久前制作的一个示例:https : //github.com/sonicmouse/ComputationService