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?
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