并行启动多个异步任务的最佳方式
本文关键字:最佳 方式 任务 异步 启动 并行 | 更新日期: 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.WhenAll
或ActionBlock<T>
都可以很好地用于您的用例。