并行启动多个异步任务的最佳方法是什么?

时间:2016-08-23 15:14:16

标签: c# .net asynchronous parallel-processing

我可能需要运行数千个独立任务。它们中的每一个都可以进行数据库调用,因此他们已经尽可能地利用异步。也就是说,如果我希望所有这些都能并行运行,那么最好的方法是什么?

我目前有这个:

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())

有客观的最佳方法吗?

修改:这与标记的重复问题不同,因为我没有问过差异。我问的是哪种方式对我的用例是正确的。

1 个答案:

答案 0 :(得分:1)

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

您的选择是:

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

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

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

Task.WhenAllActionBlock<T>适用于您的用例。