首页 > 解决方案 > 具有多个等待的 WhenAll vs New 对象

问题描述

之间有区别吗

    var taskA = GetObjectA();
    var taskB = GetObjectB();
    var taskC = GetObject3();

    await Task.WhenAll(taskA, taskB, taskC);

    return new AllTasksResponse
    {
        A = taskA.Result,
        B = taskB.Result,
        C = taskC.Result
    };

return new AllTasksResponse
{
    A = await GetObjectA(),
    B = await GetObjectB(),
    C = await GetObjectC()
};

?

基本上,我想知道创建一个等待多个任务完成的新对象是否异步运行它们。或者我应该在这些情况下使用WhenAll(或WaitAll)来确保所有任务将并行运行?

标签: c#async-await

解决方案


是的,两者之间存在巨大差异。

  1. 在第一种情况下,假设它们之间没有资源争用,所有 3 个任务将并行且独立地进行。

    但是,在第二种情况下,他们只会一一进行。

  2. 备注部分WhenAll()也很重要。

  3. 根据有效的同步上下文(如果有的话),您遇到潜在死锁的点对于两者来说也是不同的。

  4. 任务引发的异常可见点不同。


推荐阅读