簡體   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