【问题标题】:Run 1 task with IHostedService使用 IHostedService 运行 1 个任务
【发布时间】:2020-01-21 18:32:13
【问题描述】:

我做错了什么?

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-core background


    【解决方案1】:

    控制IHostedservice服务的启动

    你不能。 IHostedService的启动和停止由Host自己控制。见official docs

    运行超过 1 个 IHostedservice 服务实例

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

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

    官方文档对此有一个excellent example

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

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

    await Task.WhenAll(...);
    

    更多详情请见parallel-programming

    【讨论】:

    • 谢谢 示例是 VG 我现在可以看到我可以将 MonitorLoop 类(或我的“循环”类)中的任务排入队列
    猜你喜欢
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    • 2023-01-21
    • 2011-10-02
    • 2023-03-07
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多