2

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

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

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

4

1 回答 1

4

当没有更多的空闲线程时,有几种算法会启动。主要的一种是线程池会慢慢创建额外的线程(最多 2 个/秒)。

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

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

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

于 2011-10-11T09:00:22.977 回答