gpt4 book ai didi

c# - await Task.WhenAll 不等待所有任务完成

转载 作者:行者123 更新时间:2023-11-30 18:56:22 24 4
gpt4 key购买 nike

我最近一直在尝试使用 async-await,但我仍然无法让一些东西发挥作用。

为什么这段代码并不总是将“100”写入控制台?

不应该

await Task.WhenAll(tasks); 

等待所有 100 个任务完成?

static List<int> list = new List<int>();

static void Main(string[] args)
{
NewMethod();
Console.ReadLine();
}

private async static void NewMethod()
{
var tasks = new List<Task>();
for (int i = 0; i < 100; i++)
{
tasks.Add(Func(i));
}

Console.WriteLine("Lol");

await Task.WhenAll(tasks);

Console.WriteLine(list.Count());
}

static async Task Func(int i)
{
await Task.Delay(100);
list.Add(i);
}

我是在做错什么还是这是某种异步等待的缺点?

同理

Task.WaitAll(tasks.ToArray());

一开始我不确定在这种情况下它是否相等。

有几个类似的问题,但我的例子真的很简单,我在现有的答案中找不到解释。

最佳答案

您遇到元素数量不一致的原因是因为 List<T>不是线程安全的

在你之后await Task.Delay(100) ,将元素添加到列表的延续发生在任意线程池上,并发,因为多个任务正在执行。如果您将实现切换为使用 ConcurrentBag<int> ,这不会发生。

关于c# - await Task.WhenAll 不等待所有任务完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30504464/

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