C# 将任务添加到列表<;任务>;执行它们,使Task.WhenAll()冗余
我需要在应用程序启动时运行一系列异步web查询。为什么在本例中,即使我注释掉这一行,两个任务都会执行C# 将任务添加到列表<;任务>;执行它们,使Task.WhenAll()冗余,c#,asynchronous,task,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> Tas
//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.");
}
static void Main(字符串[]args)
{
执行();
Console.ReadKey();
}
私有静态异步void Execute()
{
Func Task1=(异步()=>
{
等待任务。延迟(1000);
Console.WriteLine(“任务1已完成”);
});
var tasks=新列表{Task1(),Task2()};
等待任务。何时(任务);
}
专用静态异步任务Task2()
{
等待任务。延迟(1000);
Console.WriteLine(“任务2已完成”);
}
所有的都是构建一个新的任务
,该任务将在提供给它的所有任务完成后完成(并酌情传播错误/取消/结果)。它不会启动任何东西,也不会做任何事情。对程序行为的任何更改都与您对它返回的任务所做的操作有关,仅此而已
这些方法在您调用它们时开始执行,如下所示:
var tasks = new List<Task> { Task1(), Task2() };
var tasks=新列表{Task1(),Task2()};
请注意,如果您的方法返回一个任务
,则没有等待任务。当所有任务
将在您完成启动任务时完成,而不是在它们完成运行时完成,并且如果其中一个任务出错或被取消,则返回的任务不会出错。使用WhenAll
,如果Execute
方法返回了一个任务,则在这两个任务都完成之前,它不会完成,并且会传播它们的错误
但是,由于您使用了async void
方法,因此在使用该方法时需要非常小心(编写这种方法通常是错误的,这里就是这种情况)方法的调用者甚至无法观察使用与否之间的差异。@它不会阻止线程,它返回一个任务,该任务在所有其他任务完成后完成,反过来可以用来阻止线程。调用Task1(),Task2()将执行任务。