web-dev-qa-db-ja.com

ASP.NET CoreでBackgroundServiceを開始する正しい方法

ASP.NET Core 2.1アプリケーションにBackgroundServiceを実装しました。

_public class MyBackgroundService : BackgroundService
{
    protected override Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (true)
        {
            await DoSomethingAsync();
            await Task.Delay(10 * 1000);
        }
        return Task.CompletedTask;
    }
}
_

ConfigureServices()メソッドに登録しました:

_services.AddSingleton<MyBackgroundService>();
_

私は現在、(しぶしぶ)StartAsync()メソッド内からConfigure()メソッドを呼び出して(待機せずに)開始しています:

_app.ApplicationServices.GetService<SummaryCache>().StartAsync(new CancellationToken());
_

長期実行サービスを開始するためのベストプラクティスの方法は何ですか?

6
Creyke

StartAsyncを明示的に呼び出す必要はありません。

呼び出し中

_services.AddSingleton<MyBackgroundService>();
_

すべてのサービス実装はIHostedServiceインターフェイスを介してDI経由で解決されるため、機能しません。 編集:例svcProvider.GetServices<IHostedService>() -> IEnumerable<IHostedService>

次のいずれかを呼び出す必要があります。

_services.AddSingleton<IHostedService, MyBackgroundService>();
_

または

_services.AddHostedService<MyBackgroundService>();
_

編集:AddHostedServiceはIHostedServiceも登録します: https://docs.Microsoft.com/en-us/dotnet/api/Microsoft.extensions.dependencyinjection.servicecollectionhostedserviceextensions.addhostedservice?view = aspnetcore-2.2

11
Cosmin Sontu