.net-core - .net 核心工作人员服务中有多个工作人员?
问题描述
dot net core 3.0 worker services模板如下图:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices(services =>
{
services.AddHostedService<Worker>();
});
}
“Worker”类派生自BackgroundService。它每 1000 毫秒循环一次将日志写入控制台。
我的问题:
我可以同时运行多个“工人”吗?(我知道我可以创建另一个类“Worker2”。但是我可以运行同一个类“Worker”的两个副本吗?)
如果是,我如何配置两个具有不同配置或参数的“工人”,例如,两个具有不同循环间隔的工人?(因为“Worker”类的实例是由 DI 框架创建的。我不知道如何将不同的配置/参数传递给“Worker”的两个不同实例)
解决方案
你可以有一个“父母”工人像这样启动“真正的”工人......
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
var workers = new List<Task>();
foreach(var delay in _config.LoopIntervals)
workers.Add(DoRealWork(delay, stoppingToken));
await Task.WhenAll(workers.ToArray());
}
}
然后...
private async Task DoRealWork(int delay, CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("worker {delay} checking in at {time}", delay, DateTimeOffset.Now);
await Task.Delay(delay, stoppingToken);
}
}
_config 从 appSettings.json 填充并像这样传递给 Worker 的构造函数......
var cfg = hostContext.Configuration.GetSection(nameof(WorkerConfig)).Get<WorkerConfig>();
services.AddSingleton(cfg);
services.AddHostedService<Worker>();
和应用程序设置...
{
"WorkerConfig": {
"LoopIntervals": [ 1000, 2000, 3000 ]
}
}
推荐阅读
- html - 引导带覆盖自定义导航栏
- python - 删除特定 url 路径的身份验证和权限
- safari - 澄清什么是 safari 经典模式?
- powershell - 使用 PowerShell 的 Windows 10 版本更新
- swift - SwiftUI 在预览 macOS 目标时排除 Swift 包
- c++ - 如何在 gmock 中测试失败
- r - 如何将for循环与我在R中制作的函数结合起来
- go - 如何将 tlsConfig 与 RoundTripper 一起使用?
- python - 非常基本的 Python 语法
- python - 如何在Python中获取列表中重复元素的最高索引值