从线程的角度来看,这段代码会发生什么?
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.Run
或 Task.Factory.StartNew
时),但其他任务则不是(例如使用 TaskCompletionSource<T>
创建的任务)。
现在,假设您的情况是 process
返回在线程中运行的任务。同样,这取决于任务的安排方式。通常,如果您使用 Task.Run
,或Task.Factory.StartNew
使用默认创建选项,它将使用 ThreadPool
中的线程。 。因此,如果您创建的任务多于池中的最大线程数,它们将排队直到线程可用。
因此,多个任务将并行运行,但不是全部;这取决于 ThreadPool
中的最大线程数.
关于.net - 使用 foreach/WhenAll 时实际上会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26876039/