gpt4 book ai didi

.net - 使用 foreach/WhenAll 时实际上会发生什么?

转载 作者:行者123 更新时间:2023-12-02 09:35:27 26 4
gpt4 key购买 nike

从线程的角度来看,这段代码会发生什么?

public static Task ForEach<T>(IEnumerable<T> items, Func<T, Task> process) {
var tasks = new List<Task>();
foreach (var item in items) {
tasks.Add(process(item));
}
return Task.WhenAll(tasks);
}

所有任务都计划并行运行还是某些任务可以顺序执行?
如果集合很大,是否会出现问题(除了内存使用之外)?

最佳答案

Are all tasks scheduled to run in parallel or can some execute sequentially?
Would there be problems (aside from memory usage) if the collection is large?

一般来说没有办法回答这个问题,因为这取决于 Task 的类型。由 process 返回。 一个Task不是线程;它只是代表一个操作,并具有在操作完成时通知的机制。某些任务是使用线程实现的(例如,当您使用 Task.RunTask.Factory.StartNew 时),但其他任务则不是(例如使用 TaskCompletionSource<T> 创建的任务)。

现在,假设您的情况是 process返回在线程中运行的任务。同样,这取决于任务的安排方式。通常,如果您使用 Task.Run ,或Task.Factory.StartNew使用默认创建选项,它将使用 ThreadPool 中的线程。 。因此,如果您创建的任务多于池中的最大线程数,它们将排队直到线程可用。

因此,多个任务将并行运行,但不是全部;这取决于 ThreadPool 中的最大线程数.

关于.net - 使用 foreach/WhenAll 时实际上会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26876039/

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