首页 > 解决方案 > .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”的两个不同实例)

标签: .net-core

解决方案


你可以有一个“父母”工人像这样启动“真正的”工人......

        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 ]
  }
}

推荐阅读