繁体   English   中英

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

[英]How to run multiple BackgroundService parallel in .net core 3.0?

如何并行运行多个 IHostedServices?

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

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

服务如下所示:

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

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

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

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

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

//第二次服务和第一次一样:

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

并在 Program.cs 中注册它们

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

我遇到过同样的问题:多种服务以不同的频率完成不同的工作。

当研究它时,BackgroundService 似乎是为顺序执行而设计的(基于无限循环的服务的最大敌人)。

从这个线程获得第一个提示后,我找到了适用于我的案例https://docs.microsoft.com/en-us/dotnet/core/extensions/timer-service的解决方案

基本 TimerService 实现 IHostedService 和 IAsyncDisposable。

  • StartAsync() 在 DoWork() 上启动计时器
  • DoWork() 是您可覆盖的主要工作程序。
  • StopAsync() 优雅地停止计时器。
  • DisposeAsync() 清理。

我已经通过派生具有不同执行频率的多个 TimerService 并使用 services.AddHostedService<>(); 添加它们进行了测试

他们都在同一时间开始和运行,按时完成。

/.\ 它不是基于任务的,因为它使用计时器事件。 之所以这么说,是因为有一次我混合了基于时间的事件和任务 /!\

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM