我们有一个.ForEach
循环(TPL),可以启动许多很多任务。
由于TPL正在从线程池中消耗线程,我想知道当没有更多线程可用时会发生什么?
调用代码是否会阻塞,直到线程再次可用?
我知道线程池有一个全局工作队列,其中工作项(Task
)将排队。该队列可以满员吗?
我们的问题是一些任务是长时间运行(30分钟)而有些是短暂的(一秒钟),但我们有数千个这样的任务,如果不是更多。 TPL是否为我开始的每个任务启动一个新线程?我想不是。线程池什么时候会耗尽?
答案 0 :(得分:4)
当没有更多的免费线程时,有几种算法正在进行中。主要的一点是ThreadPool将慢慢创建额外的线程(最多2 /秒)。
这有助于解决长时间运行任务的情况,但系统并不完美。对于创建数百个线程的情况,您的应用程序可能会崩溃。
第一种方法是在ForEach上指定DegreeOfParallelism。您希望将线程数限制为numberOfCores * someFactor
,其中someFactor取决于任务执行的I / O.
您还可以调查自定义TPL调度程序,我对此并不了解。