Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将任务添加到列表<;任务>;执行它们,使Task.WhenAll()冗余_C#_Asynchronous_Task - Fatal编程技术网

C# 将任务添加到列表<;任务>;执行它们,使Task.WhenAll()冗余

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

我需要在应用程序启动时运行一系列异步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.");
}
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()将执行任务。