并行启动多个异步任务的最佳方式

本文关键字:最佳 方式 任务 异步 启动 并行 | 更新日期: 2023-09-27 18:03:42

我可能有几千个独立的任务需要运行。它们中的每一个都可能调用数据库,所以它们已经尽可能地利用了异步。也就是说,如果我想让它们并行运行最好的方法是什么?

I've got this current:

Parallel.For(0, items.Count, async _ => await PerformTask());

我也考虑过使用:

List<Task> tasks = new List<Task>();
for(var i = 0; i < items.Count; ++i) tasks.Add(PerformTask());
await Task.WhenAll(tasks); // or possibly Task.WaitAll(tasks.ToArray())

是否有客观最好的方法来做到这一点?

编辑:这与标记重复的问题不同,因为我没有问差异。

并行启动多个异步任务的最佳方式

Parallel不是一个选项,因为你有异步操作。

你的选择是:

  • 同时启动所有任务,然后使用await Task.WhenAll让它们全部完成。如果您发现需要限制活动任务的数量,可以使用SemaphoreSlim
  • 使用ActionBlock<T>(来自TPL数据流)单独将工作排队。如果你想同时处理多个,可以使用ExecutionDataflowBlockOptions.MaxDegreeOfParallelism

如果你不知道所有的任务在他们开始的时候(即,如果更多的任务可以在你处理的时候到达),或者如果你的代码的其他附近部分将适合"管道"的设计,ActionBlock<T>方法会更好。

Task.WhenAll很好,因为它不需要一个独立的库,有自己的设计理念和学习曲线。

Task.WhenAllActionBlock<T>都可以很好地用于您的用例。