代码之家  ›  专栏  ›  技术社区  ›  Kirill Rakhman

嵌套多个task.whenall和将所有任务扁平化为一个task.whenall之间有区别吗?

  •  1
  • Kirill Rakhman  · 技术社区  · 6 年前

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

    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 回复  |  直到 6 年前
        1
  •  2
  •   IRQ Conflict    6 年前

    我认为它们是相同的-但是我建议第一个版本而不是第二个版本,纯粹是为了可读性/可理解性-很容易错误地认为,只有在DothisAsync()和DothAsync()都在第二个版本中完成后,如果您将其读取到随便说一下,三者实际上都是平行的。