2023-12-28 15:18:03 +08:00
|
|
|
|
using System.Collections.Concurrent;
|
|
|
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
|
|
|
|
|
|
namespace ConsoleApp2.Services;
|
|
|
|
|
|
2024-01-04 09:00:44 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 快速批量创建和等待任务
|
|
|
|
|
/// </summary>
|
2023-12-28 15:18:03 +08:00
|
|
|
|
public class TaskManager
|
|
|
|
|
{
|
|
|
|
|
private readonly ConcurrentBag<Task> _tasks;
|
|
|
|
|
private readonly ILogger _logger;
|
|
|
|
|
|
2024-01-04 09:00:44 +08:00
|
|
|
|
public int TaskCount => _tasks.Count;
|
2023-12-28 15:18:03 +08:00
|
|
|
|
public int RunningTaskCount => _tasks.Count(task => !task.IsCompleted);
|
|
|
|
|
public IReadOnlyCollection<Task> Tasks => _tasks;
|
|
|
|
|
|
|
|
|
|
public TaskManager(ILogger<TaskManager> logger)
|
|
|
|
|
{
|
|
|
|
|
_tasks = new ConcurrentBag<Task>();
|
|
|
|
|
_logger = logger;
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-19 11:17:22 +08:00
|
|
|
|
public void CreateTask(Func<Task> func, CancellationToken cancellationToken = default)
|
2023-12-28 15:18:03 +08:00
|
|
|
|
{
|
2024-01-19 11:17:22 +08:00
|
|
|
|
var task = Task.Run(func, cancellationToken);
|
2023-12-28 15:18:03 +08:00
|
|
|
|
_tasks.Add(task);
|
2024-01-04 09:00:44 +08:00
|
|
|
|
_logger.LogDebug("New task created");
|
|
|
|
|
}
|
2024-01-19 11:17:22 +08:00
|
|
|
|
|
|
|
|
|
public void CreateTasks(Func<Task> func,int taskCount, CancellationToken cancellationToken = default)
|
2024-01-12 16:50:37 +08:00
|
|
|
|
{
|
|
|
|
|
for (int i = 0; i < taskCount; i++)
|
|
|
|
|
{
|
|
|
|
|
CreateTask(func, cancellationToken);
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-01-04 09:00:44 +08:00
|
|
|
|
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();
|
2023-12-28 15:18:03 +08:00
|
|
|
|
}
|
|
|
|
|
}
|