我有一堆异步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.");
}
答案 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}}之间的差异。