using System.Collections.Concurrent;
using Microsoft.Extensions.Logging;
namespace ConsoleApp2.Services;
///
/// 快速批量创建和等待任务
///
public class TaskManager
{
private readonly ConcurrentBag _tasks;
private readonly ILogger _logger;
public int TaskCount => _tasks.Count;
public int RunningTaskCount => _tasks.Count(task => !task.IsCompleted);
public IReadOnlyCollection Tasks => _tasks;
public TaskManager(ILogger logger)
{
_tasks = new ConcurrentBag();
_logger = logger;
}
public void CreateTask(Func func, CancellationToken cancellationToken = default)
{
var task = Task.Factory.StartNew(func, cancellationToken);
_tasks.Add(task);
_logger.LogDebug("New task created");
}
public void CreateTasks(Func func,int taskCount, CancellationToken cancellationToken = default)
{
for (int i = 0; i < taskCount; i++)
{
CreateTask(func, cancellationToken);
}
}
public async Task WaitAll()
{
await Task.WhenAll(_tasks);
}
public void ClearTask()
{
if(RunningTaskCount != 0)
throw new InvalidOperationException("Unable to clear task. There are still running tasks");
_tasks.Clear();
}
}