如何在 .net core 3.0 中并行运行多个 BackgroundService?

cSt*_*off 4 c# .net-core .net-core-3.0

如何并行运行多个 IHostedServices?

我在 .Net Core 3.0 中使用 WorkerService 并希望两个服务并行运行。目前,第二个服务正在等待第一个服务完成。这两种服务都应该无休止地运行。

    public static IHostBuilder CreateHostBuilder(string[] args)
    {
        return Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) =>
            {
                services.AddHostedService<ServiceA>();
                services.AddHostedService<ServiceB>();
            });
    }
Run Code Online (Sandbox Code Playgroud)

一个服务看起来像这样:

public class ServiceA : BackgroundService
{
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        do
        {
            Console.WriteLine("Sample");
            await Task.Delay(5000, stoppingToken);
        } while (!stoppingToken.IsCancellationRequested);
    }
}
Run Code Online (Sandbox Code Playgroud)

// 编辑:我非常不情愿地使用这样的Task.Run(() => method());方法。但当然这种方式总是有效的:

public class ServiceA : BackgroundService
{
    public override Task StartAsync(CancellationToken cancellationToken)
    {
        Task.Factory.StartNew(() => ExecuteAsync(cancellationToken), cancellationToken);
        return Task.CompletedTask;
    }
}
Run Code Online (Sandbox Code Playgroud)

ibr*_*gon 6

我问了自己一个类似的问题并进行了一些搜索,但找不到好的答案。我解决了Task.Run使用取消令牌运行每个后台服务的问题,BackgroundService.ExecuteAsync() 我有 2 个像您这样的服务。

public class BackgroundService1: BackgroundService
{
    public BackgroundService1()
    {
    }
    protected override Task ExecuteAsync(CancellationToken stoppingToken)
    {
        Task.Run(async () =>
        {
            await DoWork(stoppingToken);
        }, stoppingToken);
        return Task.CompletedTask;
    }
}
Run Code Online (Sandbox Code Playgroud)

//第二个服务就像第一个:

public class BackgroundService2: BackgroundService
{
    public BackgroundService2()
    {
    }
    protected override Task ExecuteAsync(CancellationToken stoppingToken)
    {
        Task.Run(async () =>
        {
            await DoWork(stoppingToken);
        }, stoppingToken);
        return Task.CompletedTask;
    }
}
Run Code Online (Sandbox Code Playgroud)

并在 Program.cs 中注册它们

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) =>
            {
                services.AddHostedService<BackgroundService1>();
                services.AddHostedService<BackgroundService2>();
            })
            .UseWindowsService()
Run Code Online (Sandbox Code Playgroud)