嵌套多个 Task.WhenAll 和将所有任务平展为一个 Task.WhenAll 之间是否有区别?



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

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;

两个版本之间的行为是否有任何差异?一个首选或模式是否比另一个更惯用?

我认为它们是相同的 - 但是,纯粹为了可读性/可理解性,我会推荐第一个版本而不是第二个版本 - 它很容易错误地认为 AlsoDoOtherStuffAsync 只有在 DoThisAsync(( 和 DoThatAsync(( 都在第二个版本中完成之后才会运行,如果你随便读一下,因为这三个实际上都会并行运行。

最新更新