如何使用.NET内置方法实现可控并发的并行工作队列?
.NET 内置指定并发数执行任务的解决方案
你要的需求可以通过.NET内置组件实现,以下是两种常用方案:
方案1:使用 Parallel.ForEachAsync(.NET 6+ 专属)
这是官方在.NET 6后推出的异步并行处理API,直接支持指定最大并发度,是最贴合需求的内置实现:
int numberOfParallelThreads = 3; // 推荐存储任务创建逻辑(而非已实例化的Task),避免任务提前被调度 IEnumerable<Func<Task>> taskFactories = GetPendingTaskFactories(); // 返回任务创建委托集合 await Parallel.ForEachAsync(taskFactories, new ParallelOptions { MaxDegreeOfParallelism = numberOfParallelThreads }, async (taskFactory, cancellationToken) => { await taskFactory(); });
方案2:使用 SemaphoreSlim 配合异步循环(全.NET版本通用)
如果需要兼容.NET 6之前的版本,可利用基础类库中的SemaphoreSlim控制并发数,这也是完全内置的方案:
int numberOfParallelThreads = 3; Queue<Task> pendingTasks = GetPendingTasks(); var semaphore = new SemaphoreSlim(numberOfParallelThreads); var runningTasks = new List<Task>(); while (pendingTasks.Count > 0) { var task = pendingTasks.Dequeue(); runningTasks.Add(Task.Run(async () => { await semaphore.WaitAsync(); try { await task; } finally { semaphore.Release(); } })); } await Task.WhenAll(runningTasks);
注意事项
- 若你手中的
Task是已启动状态,上述信号量方案无法控制其并发(因为任务已在执行),此时建议改为存储Func<Task>类型的任务创建委托,确保任务在并发控制逻辑内启动。 Task.WhenAll/Task.WaitAll确实不支持直接指定并发度,但结合上述两种内置组件即可实现需求,无需依赖第三方库。
内容的提问来源于stack exchange,提问作者Ruslan
相关产品推荐
相关产品推荐

