我们有一个 .ForEach
循环 (TPL),它启动很多很多任务。
由于 TPL 正在消耗线程池中的线程,我想知道当没有更多可用线程时会发生什么?
调用代码会阻塞直到线程再次可用吗?
我知道线程池有一个全局工作队列,工作项(Task
)将在其中排队。该队列会满吗?
我们的问题是,有些任务运行时间较长(30 分钟),有些任务运行时间较短(一秒),但我们有数千个这样的任务,甚至更多。 TPL 是否为我启动的每个任务启动一个新线程?我想不是。线程池什么时候会耗尽?
最佳答案
当没有更多的空闲线程时,会启动多种算法。主要的一个是线程池将慢慢创建额外的线程(最多 2 个/秒)。
这有助于解决长时间运行任务的情况,但系统并不完美。请注意创建数百个线程的情况,您的应用程序可能会崩溃。
第一种方法是在 ForEach 上指定 DegreeOfParallelism。您希望将线程数限制为 numberOfCores * someFactor
,其中 someFactor 取决于任务执行的 I/O。
您还可以研究自定义 TPL 调度程序,我对此了解不多。
关于c# - 当没有更多可用线程时 .ForEach 循环是否阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7723525/