asp.net-core - 使用 IHostedService 运行 1 个任务
问题描述
我究竟做错了什么?
IHostedService 类在 ASP.net 核心 HostBuilder 中注册。
然后在后台连续运行,即使他们没有工作要做。
没有办法让他们工作,所以我想他们必须从动态存储中获取任务,例如数据库
因此,他们似乎主要进行民意调查。或运行短间隔计时器;找工作
然后,当他们找到工作时,他们一次只能做 1 件。
因此,如果我的用户(100 多个)在星期五(或他们希望的任何一天)运行报告,该服务只会轮询数据库 6.5 天,然后限制 0.5 天以生成 100 多个报告。
那我怎么能
- 控制 IHostedservice 服务的启动
- 运行超过 1 个 IHostedservice 服务实例
- 以数据的形式发送任务到IHostedservice服务(实例)
此外,我将需要 10 多种不同类型的 IHostedService。(10+ 种不同的投票类型)
因此,在后台运行它们只是为了轮询数据库会占用 Web 服务器和数据库服务器上的 CPU 周期
解决方案
控制 IHostedservice 服务的启动
你不能。的启动和停止IHostedService
由Host自己控制。见官方文档
运行超过 1 个 IHostedservice 服务实例
由于IHostedService
由主机本身运行,我相信您实际上并不想启动多个IHostedService
,而是您正在寻找一种方法以并行方式启动任务,然后等待所有任务完成。IMO,更好的方法是创建一个委托,该委托返回一个由多个子任务组成的任务。此子任务将以并行方式运行。
以数据的形式发送任务到IHostedservice服务(实例)
官方文档有一个很好的例子:
- 您可以使用委托(一种数据形式)来包装您的任务。
- 当您想将此任务发送到某处(例如在控制器中)的 IHostedService 时,只需将您的任务包装器(委托实例)排入队列服务。
- HostedService 将等到队列中有任务,将工作项出列,并执行该委托实例。
如果您想同时启动多个工作项,只需将多个工作项出列,然后使用Task.WhenAll启动这些任务:
await Task.WhenAll(...);
有关更多详细信息,请参阅并行编程
推荐阅读
- typescript - 如何为自定义 chai 断言添加类型提示?
- c++ - 是否可以在继承的类中使用具有不同参数的构造函数?
- p5.js - 如何在 Windows 上安装 P5js?
- sql-server - 在 SQL Server 中重命名后获取存储过程的文本
- java - java.lang.RuntimeException:无法启动活动组件
- sql - 如何在不同的列中按行分组
- signalr - aspnet/signalr:解析握手响应时出错:TypeError:“instanceof”的右侧不可调用
- if-statement - 交易视图的 Pine 脚本:如何在特定时间范围内显示
- javascript - 如何使用 jquery 替换会话存储值中的文本
- javascript - NPM 私有包自定义构建