using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; namespace ConsoleApp2.Services; public class TaskMonitorService : BackgroundService { private readonly IHostApplicationLifetime _lifetime; private readonly TaskManager _taskManager; private readonly ILogger _logger; public TaskMonitorService(IHostApplicationLifetime lifetime, TaskManager taskManager, ILogger logger) { _lifetime = lifetime; _taskManager = taskManager; _logger = logger; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!_taskManager.MainTaskCompleted || _taskManager.RunningTaskCount != 0) { var running = 0; var error = 0; var completed = 0; var canceled = 0; foreach (var task in _taskManager.Tasks) { switch (task.Status) { case TaskStatus.Running: running++; break; case TaskStatus.Canceled: canceled++; break; case TaskStatus.Faulted: error++; break; case TaskStatus.RanToCompletion: completed++; break; default: throw new ArgumentOutOfRangeException(); } } _logger.LogInformation( "Task monitor: running: {Running}, error: {Error}, completed: {Completed}, canceled: {Canceled}", running, error, completed, canceled); await Task.Delay(2000); } _logger.LogInformation("***** All tasks completed *****"); } }