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 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(); } }