gpt4 book ai didi

c# - Task.WhenAll() 和 foreach(var task in tasks) 有什么区别

转载 作者:行者123 更新时间:2023-11-30 19:38:06 27 4
gpt4 key购买 nike

经过几个小时的努力,我在我的应用程序中发现了一个错误。我认为下面的 2 个函数具有相同的行为,但事实证明它们没有。

谁能告诉我引擎盖下到底发生了什么,以及为什么它们的行为方式不同?

public async Task MyFunction1(IEnumerable<Task> tasks){
await Task.WhenAll(tasks);

Console.WriteLine("all done"); // happens AFTER all tasks are finished
}

public async Task MyFunction2(IEnumerable<Task> tasks){
foreach(var task in tasks){
await task;
}

Console.WriteLine("all done"); // happens BEFORE all tasks are finished
}

最佳答案

如果所有任务都成功完成,它们的功能将相同

如果您使用 WhenAll 并且任何项目失败,它仍然不会完成,直到所有项目都完成,并且它将表示一个 AggregatException 包装来自所有 任务的所有 错误。

如果您await 每一个,那么它会在遇到任何失败的项目时立即完成,并且它将代表那个一个异常 错误,而不是任何其他错误。


两者的不同之处还在于 WhenAll 将在开始时具体化整个 IEnumerable,然后再向其他项目添加任何延续。如果 IEnumerable 表示已经存在和启动的任务的集合,那么这不相关,但如果迭代可枚举的行为创建和/或启动任务,那么在开始时具体化序列将并行运行它们,并在获取下一个任务之前等待每个任务将按顺序执行它们。下面是您可以传入的 IEnumerable,它的行为与我在此处描述的一样:

public static IEnumerable<Task> TaskGeneratorSequence()
{
for(int i = 0; i < 10; i++)
yield return Task.Delay(TimeSpan.FromSeconds(2);
}

关于c# - Task.WhenAll() 和 foreach(var task in tasks) 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35092763/

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