我可能需要运行数千个独立任务。它们中的每一个都可以进行数据库调用,因此他们已经尽可能地利用异步。也就是说,如果我希望所有这些都能并行运行,那么最好的方法是什么?
我目前有这个:
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())
有客观的最佳方法吗?
修改:这与标记的重复问题不同,因为我没有问过差异。我问的是哪种方式对我的用例是正确的。
答案 0 :(得分:1)
Parallel
不是一个选项,因为您有异步操作。
您的选择是:
await Task.WhenAll
完成所有任务。如果您发现需要限制活动任务的数量,则可以使用SemaphoreSlim
。ActionBlock<T>
(来自TPL数据流)单独排队工作。如果要同时处理多个,可以使用ExecutionDataflowBlockOptions.MaxDegreeOfParallelism
。 ActionBlock<T>
方法会更好,如果你不知道他们开始时的所有任务(即,如果你在处理时有更多的任务可以到达),或者附近的其他附近部分你的代码将适合“管道”式的设计。
Task.WhenAll
很不错,因为它不需要一个具有自己的设计理念和学习曲线的独立库。
Task.WhenAll
或ActionBlock<T>
适用于您的用例。