将任务添加到List <task>执行它们会使Task.WhenAll()变为冗余

时间:2017-09-21 13:53:31

标签: c# asynchronous task

我有一堆异步Web查询,我需要在应用程序启动时运行。为什么在这个例子中,即使我注释掉这一行,这两个任务都会执行?

//await Task.WhenAll(tasks);

似乎我是否使用Task.WhenAll()没有区别。怎么样?

static void Main(string[] args)
{
    Execute();
    Console.ReadKey();
}

private static async void Execute()
{
    Func<Task> Task1 = (async () =>
    {
        await Task.Delay(1000);
        Console.WriteLine("Task 1 completed.");
    });

    var tasks = new List<Task> { Task1(), Task2() };

    await Task.WhenAll(tasks);
}

private static async Task Task2()
{
    await Task.Delay(1000);
    Console.WriteLine("Task 2 completed.");
}

1 个答案:

答案 0 :(得分:1)

所有WhenAll所做的是构建一个新的Task,当提供给它的所有任务都已完成(并根据需要传播错误/取消/结果)时,它将完成。它没有启动任何东西,或者任何东西。对程序行为的任何更改都与您对其返回的Task所做的操作有关。

当你调用它们时,方法会开始执行,这在这里完成:

var tasks = new List<Task> { Task1(), Task2() };

请注意,如果您的方法返回了Task,那么await Task.WhenAll Task只要您完成启动就会完成WhenAll < / em>任务,而不是当它们完成运行时,如果任务中的任何一个错误输出或被取消,则返回的任务不会出现故障。使用Execute if ,您的async void方法返回了一项任务,它将无法完成,直到这两项任务完成,并传播其错误。

但是因为你使用了WhenAll方法,你需要非常小心使用它(通常 错误来编写这样的方法,就像这里的情况一样)方法的调用者甚至无法观察使用{{1}}之间的差异。