gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 04:09:14 24 4
gpt4 key购买 nike

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

//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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com