将多个Task.WhenAll嵌套和将所有任务拼合为一个Task.WhenAll之间有区别吗?

时间:2018-10-23 09:36:47

标签: c# async-await task

有时我想并行等待一堆任务,但是任务本身取决于某些条件。我会写

var tasks = new List<Task> { DoThisAsync(), DoThatAsync() };

if (condition) tasks.Add(AlsoDoOtherStuffAsync());

await Task.WhenAll(tasks);

但是如果我写

var task = Task.WhenAll(DoThisAsync(), DoThatAsync());

if (condition) task = Task.WhenAll(task, AlsoDoOtherStuffAsync());

await task;

两个版本之间的行为是否有差异?是一种偏爱的习惯或方式吗?

1 个答案:

答案 0 :(得分:2)

我认为它们是相同的-但是出于纯粹的可读性/可理解性,我还是建议第二个版本优先使用-容易误认为AlsoDoOtherStuffAsync仅在DoThisAsync()和DoThatAsync()都在第二个版本中完成之后才运行版本,如果您不经意地阅读它,那么实际上这三个版本实际上都是并行运行的。