gpt4 book ai didi

c# - 为什么我应该更喜欢单个 'await Task.WhenAll' 而不是多个等待?

转载 作者:IT王子 更新时间:2023-10-29 03:35:44 25 4
gpt4 key购买 nike

如果我不关心任务完成的顺序,只需要它们全部完成,我是否仍应使用 await Task.WhenAll 而不是多个 await?例如,DoWork2 是否低于 DoWork1 的首选方法(为什么?):

using System;
using System.Threading.Tasks;

namespace ConsoleApp
{
class Program
{
static async Task<string> DoTaskAsync(string name, int timeout)
{
var start = DateTime.Now;
Console.WriteLine("Enter {0}, {1}", name, timeout);
await Task.Delay(timeout);
Console.WriteLine("Exit {0}, {1}", name, (DateTime.Now - start).TotalMilliseconds);
return name;
}

static async Task DoWork1()
{
var t1 = DoTaskAsync("t1.1", 3000);
var t2 = DoTaskAsync("t1.2", 2000);
var t3 = DoTaskAsync("t1.3", 1000);

await t1; await t2; await t3;

Console.WriteLine("DoWork1 results: {0}", String.Join(", ", t1.Result, t2.Result, t3.Result));
}

static async Task DoWork2()
{
var t1 = DoTaskAsync("t2.1", 3000);
var t2 = DoTaskAsync("t2.2", 2000);
var t3 = DoTaskAsync("t2.3", 1000);

await Task.WhenAll(t1, t2, t3);

Console.WriteLine("DoWork2 results: {0}", String.Join(", ", t1.Result, t2.Result, t3.Result));
}


static void Main(string[] args)
{
Task.WhenAll(DoWork1(), DoWork2()).Wait();
}
}
}

最佳答案

是的,使用 WhenAll 因为它会立即传播所有错误。使用多个等待,如果较早的等待之一抛出,您将丢失错误。

另一个重要区别是 WhenAll 将等待所有任务完成,即使出现故障(出现故障或取消的任务)。手动按顺序等待会导致意外的并发,因为程序中想要等待的部分实际上会提前继续。

我认为这也让阅读代码变得更容易,因为您想要的语义直接记录在代码中。

关于c# - 为什么我应该更喜欢单个 'await Task.WhenAll' 而不是多个等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18310996/

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