首页 > 解决方案 > 使用 IHostedService 运行 1 个任务

问题描述

我究竟做错了什么?

IHostedService 类在 ASP.net 核心 HostBuilder 中注册。

然后在后台连续运行,即使他们没有工作要做。

没有办法让他们工作,所以我想他们必须从动态存储中获取任务,例如数据库

因此,他们似乎主要进行民意调查。或运行短间隔计时器;找工作

然后,当他们找到工作时,他们一次只能做 1 件。

因此,如果我的用户(100 多个)在星期五(或他们希望的任何一天)运行报告,该服务只会轮询数据库 6.5 天,然后限制 0.5 天以生成 100 多个报告。

那我怎么能

  1. 控制 IHostedservice 服务的启动
  2. 运行超过 1 个 IHostedservice 服务实例
  3. 以数据的形式发送任务到IHostedservice服务(实例)

此外,我将需要 10 多种不同类型的 IHostedService。(10+ 种不同的投票类型)

因此,在后台运行它们只是为了轮询数据库会占用 Web 服务器和数据库服务器上的 CPU 周期

标签: asp.net-corebackground

解决方案


控制 IHostedservice 服务的启动

你不能。的启动和停止IHostedService由Host自己控制。见官方文档

运行超过 1 个 IHostedservice 服务实例

由于IHostedService由主机本身运行,我相信您实际上并不想启动多个IHostedService,而是您正在寻找一种方法以并行方式启动任务,然后等待所有任务完成。IMO,更好的方法是创建一个委托,该委托返回一个由多个子任务组成的任务。此子任务将以并行方式运行。

以数据的形式发送任务到IHostedservice服务(实例)

官方文档有一个很好的例子

  • 您可以使用委托(一种数据形式)来包装您的任务。
  • 当您想将此任务发送到某处(例如在控制器中)的 IHostedService 时,只需将您的任务包装器(委托实例)排入队列服务。
  • HostedService 将等到队列中有任务,将工作项出列,并执行该委托实例。

如果您想同时启动多个工作项,只需将多个工作项出列,然后使用Task.WhenAll启动这些任务:

await Task.WhenAll(...);

有关更多详细信息,请参阅并行编程


推荐阅读