57 lines
1.8 KiB
C#
57 lines
1.8 KiB
C#
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<TaskMonitorService> _logger;
|
|
|
|
public TaskMonitorService(IHostApplicationLifetime lifetime, TaskManager taskManager,
|
|
ILogger<TaskMonitorService> 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 *****");
|
|
}
|
|
} |