当没有可用的线程时,.ForEach循环是否阻塞

时间:2011-10-11 08:53:21

标签: c# .net multithreading task-parallel-library synchronizationcontext

我们有一个.ForEach循环(TPL),可以启动许多很多任务。 由于TPL正在从线程池中消耗线程,我想知道当没有更多线程可用时会发生什么? 调用代码是否会阻塞,直到线程再次可用?

我知道线程池有一个全局工作队列,其中工作项(Task)将排队。该队列可以满员吗?

我们的问题是一些任务是长时间运行(30分钟)而有些是短暂的(一秒钟),但我们有数千个这样的任务,如果不是更多。 TPL是否为我开始的每个任务启动一个新线程?我想不是。线程池什么时候会耗尽?

1 个答案:

答案 0 :(得分:4)

当没有更多的免费线程时,有几种算法正在进行中。主要的一点是ThreadPool将慢慢创建额外的线程(最多2 /秒)。

这有助于解决长时间运行任务的情况,但系统并不完美。对于创建数百个线程的情况,您的应用程序可能会崩溃。

第一种方法是在ForEach上指定DegreeOfParallelism。您希望将线程数限制为numberOfCores * someFactor,其中someFactor取决于任务执行的I / O.

您还可以调查自定义TPL调度程序,我对此并不了解。