c# - 当没有更多可用线程时 .ForEach 循环是否阻塞

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

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

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

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

最佳答案

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

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

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

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

关于c# - 当没有更多可用线程时 .ForEach 循环是否阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7723525/

相关文章:

c# - ParallelQuery 具有采用 IEnumerable 的方法

c# - 在 WP7 中绑定(bind) ToggleButton 的 IsChecked 属性

c# - 2个线程同时进入一个锁定的代码块

C# 遍历子类

c# - ASP.NET Core 货币格式无法正常工作

c# - 控制台应用程序中的 .NET Core 全局异常处理程序

C: 如何使这个函数线程安全?

Java 线程 : wait and notify methods

c# - 有没有办法在C#中组合“is”和“as”

c# - 使用 AForge 访问 USB 相机控件