我希望知道执行多个异步方法的推荐方式是什么?
在System.Threading.Tasks.Dataflow中,我们可以指定最大并行度,但对于Task.WhenAll来说,无界限可能是默认值吗?
这样做:
var tasks = new List<Task>();
foreach(var item in items)
{
tasks.Add(myAsyncMethod(item));
}
await Task.WhenAll(tasks.ToArray());
或者那个:
var action = new ActionBlock<string>(myAsyncMethod, new ExecutionDataflowBlockOptions
{
MaxDegreeOfParallelism = DataflowBlockOptions.Unbounded,
BoundedCapacity = DataflowBlockOptions.Unbounded,
MaxMessagesPerTask = DataflowBlockOptions.Unbounded
});
foreach (var item in items) { }
{
action.Post(item);
}
action.Complete();
await action.Completion;
Parallel.ForEach()
? - Dmitry BychenkoTask.WhenAll
代码与并行执行任务无关 - 对于例如线程池线程、并行等的任何决策,都在myAsyncMethod
中发生,它(理论上)返回热的Task
。 - Damien_The_UnbelieverBoundedCapacity = DataflowBlockOptions.Unbounded
是默认值。如果你在选项中显式地包含它,那么你就有了一个将来可以配置为更好值的可能性。然后你的程序会开始表现出奇怪的行为,你将花费一天半时间来弄清楚为什么。 - Theodor ZouliasSendAsync
的开销可以忽略不计。 - Theodor Zoulias