c# - 将任务添加到 List<Task> 执行它们使 Task.WhenAll() 变得多余

标签 c# asynchronous task

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

//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.");
}

最佳答案

所有 WhenAll 所做的就是构造一个新的 Task,当提供给它的所有任务都完成时,它将完成(并传播错误/取消/结果适当) .它不会开始任何事情,也不会任何事情。对程序行为的任何更改都与您对它返回的 Task 所做的操作有关,仅此而已。

方法在您调用它们时开始执行,这是在这里完成的:

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

请注意,如果您的方法返回了一个Task,那么如果没有await Task.WhenAllTask 将在您完成启动任务后立即完成,而不是在它们完成运行时完成,并且如果任一个任务出错或被取消,返回的任务也不会出错。使用 WhenAll如果您的Execute 方法返回一个任务,它不会完成,直到这两个任务都完成,并且会传播它们错误。

但由于您使用了 async void 方法,您需要非常小心地使用它(编写这样的方法通常是错误的,就像这里的情况一样) 方法的调用者甚至无法观察到您是否使用 WhenAll 之间的区别。

关于c# - 将任务添加到 List<Task> 执行它们使 Task.WhenAll() 变得多余,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46345840/

相关文章:

java - 屏幕 X、Y 坐标转换为 map 经度/纬度坐标

c# - 如何使用 CommandManager 并且仍然能够手动触发 ICommand.CanExecuteChanged 事件,即明确地?

windows-phone-7 - 如何处理 emailcomposetask 中的 "The size of input should not exceed 64K"异常?

c# - 如何使用 ItemArray 将 Null 值插入 DataTable

c# - ASP.Net MVC 3 中单独项目的数据访问层和业务逻辑层

javascript - 如何从异步调用返回响应?

python - 检查我所有的 worker 是否在线 celery

c - fork() 执行不同的进程

python - 如何在用beat再次运行之前检查celery任务是否已经在运行?

c# - 忽略异常并将文件添加到列表中?