使用foreach / WhenAll时实际发生了什么?

时间:2014-11-11 22:45:29

标签: .net task-parallel-library

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

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);
}

是否所有任务都安排并行运行或者可以按顺序执行? 如果集合很大,是否会出现问题(除内存使用外)?

1 个答案:

答案 0 :(得分:5)

  

是否所有任务都安排并行运行或者可以按顺序执行?   如果集合很大,是否会出现问题(除内存使用外)?

一般情况下无法回答该问题,因为它取决于Task返回的process的类型。 Task不是主题;它只是表示操作完成时通知机制的操作。某些任务是使用线程实现的(例如,当您使用Task.RunTask.Factory.StartNew时),但其他任务不是(例如,使用TaskCompletionSource<T>创建的任务)。

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

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