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

标签 .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);
}

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

最佳答案

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/

相关文章:

c# - 如何在 C# 中获取队列中打印作业的文件路径

c# - 防止并行操作按顺序批处理执行

c# - 取消时的任务状态

c# - 证明我们的程序没有病毒的证书?

c# - 使用 DataGridView.DataSource 显示单个对象

c# - 顶级工作方法中的异步模式

c# - 在 TPL 中中止长时间运行的任务

c# - 当你等待一个失败的任务时会发生什么

.net - 在 javascript .net 中将 guid 转换为字符串

.net - 为什么生成的 IL 代码以 Nop 开头?