You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:40:29