从线程的角度来看,这段代码会发生什么?
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);
}
是否所有任务都安排并行运行或者可以按顺序执行? 如果集合很大,是否会出现问题(除内存使用外)?
答案 0 :(得分:5)
是否所有任务都安排并行运行或者可以按顺序执行? 如果集合很大,是否会出现问题(除内存使用外)?
一般情况下无法回答该问题,因为它取决于Task
返回的process
的类型。 Task
不是主题;它只是表示操作完成时通知机制的操作。某些任务是使用线程实现的(例如,当您使用Task.Run
或Task.Factory.StartNew
时),但其他任务不是(例如,使用TaskCompletionSource<T>
创建的任务)。
现在,假设在您的情况下,process
返回在线程中运行的任务。同样,这取决于任务的安排方式。通常,如果您使用Task.Run
或Task.Factory.StartNew
使用默认创建选项,它将使用ThreadPool
中的一个帖子。因此,如果您创建的任务数超过池中最大线程数,则它们将排队,直到线程可用。
因此,几个任务将并行运行,但不是全部;它取决于ThreadPool
中的最大线程数。