web-dev-qa-db-fra.com

Bonne façon de démarrer un BackgroundService dans ASP.NET Core

J'ai implémenté un BackgroundService dans une application ASP.NET Core 2.1:

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

Je l'ai enregistré dans ma méthode ConfigureServices():

services.AddSingleton<MyBackgroundService>();

Je le lance actuellement (à contrecœur) en appelant (et sans attendre) la méthode StartAsync() à partir de la méthode Configure():

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

Quelle est la meilleure méthode pour démarrer le service de longue durée?

6
Creyke

L'appel explicite à StartAsync n'est pas nécessaire.

Appel

services.AddSingleton<MyBackgroundService>();

ne fonctionnera pas car toutes les implémentations de service sont résolues via DI via l'interface IHostedService. modifier: par ex. svcProvider.GetServices<IHostedService>() -> IEnumerable<IHostedService>

Vous devez appeler soit:

services.AddSingleton<IHostedService, MyBackgroundService>();

ou

services.AddHostedService<MyBackgroundService>();

edit: AddHostedService enregistre également un IHostedService: https://docs.Microsoft.com/en-us/dotnet/api/Microsoft.extensions.dependencyinjection.servicecollectionhostedserviceextensions.addhostedservice?view = aspnetcore-2.2

11
Cosmin Sontu