using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; namespace BuildingBlocks.PersistMessageProcessor; public class PersistMessageBackgroundService( ILogger logger, IServiceProvider serviceProvider, IOptions options ) : BackgroundService { private PersistMessageOptions _options = options.Value; protected override async Task ExecuteAsync(CancellationToken stoppingToken) { logger.LogInformation("PersistMessage Background Service Start"); await ProcessAsync(stoppingToken); } public override Task StopAsync(CancellationToken cancellationToken) { logger.LogInformation("PersistMessage Background Service Stop"); return base.StopAsync(cancellationToken); } private async Task ProcessAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { await using (var scope = serviceProvider.CreateAsyncScope()) { var service = scope.ServiceProvider.GetRequiredService(); await service.ProcessAllAsync(stoppingToken); } var delay = _options.Interval is { } ? TimeSpan.FromSeconds((int)_options.Interval) : TimeSpan.FromSeconds(30); await Task.Delay(delay, stoppingToken); } } }