C# 当线程池构造新线程而不是重用它们时?

C# 当线程池构造新线程而不是重用它们时?,c#,.net,multithreading,threadpool,C#,.net,Multithreading,Threadpool,我在以下答复中读到以下段落: 线程池(按设计)使线程在调用之间保持活动状态。 这意味着ThreadStatic变量将在调用之间保持不变 将用户工作项排队 这种行为也是你不应该指望的。这个 线程池将(最终由其自行决定)释放回线程 让它们结束,并根据需要构建新线程。 在什么情况下,线程池最终会构造新线程而不是重用它们?AFAIK在“未记录”的情况下 首要考虑的是至少有4种常用的(和),每个都有自己的政策。例如,SQLCLR宿主使用SQL Server自己的,并将通过收缩池(所有类型的池,包括线程)

我在以下答复中读到以下段落:

线程池(按设计)使线程在调用之间保持活动状态。 这意味着ThreadStatic变量将在调用之间保持不变 将用户工作项排队

这种行为也是你不应该指望的。这个 线程池将(最终由其自行决定)释放回线程 让它们结束,并根据需要构建新线程。


在什么情况下,线程池最终会构造新线程而不是重用它们?

AFAIK在“未记录”的情况下

首要考虑的是至少有4种常用的(和),每个都有自己的政策。例如,SQLCLR宿主使用SQL Server自己的,并将通过收缩池(所有类型的池,包括线程)来响应


因此,为什么不假设线程总是被回收的,并且您是正确的(即,不要保持池拥有的线程的状态)。

正如Adriano所说,这是一个您不应该担心的实现细节。但是,出于好奇,这是我能找到的关于ThreadPool如何工作的最好的解释(来自:

为了克服以前实现的一些限制,CLR 4.0引入了新的思想。从控制理论领域考虑的第一种方法是爬山(HC)算法。该技术是一种基于输入输出反馈回路的自动调谐方法。系统输出以较小的时间间隔进行监控和测量,以查看受控输入的影响,并将该信息反馈到算法中,以进一步调整输入。将输入和输出视为变量,根据这些变量将系统建模为函数

简单地说,偶尔,爬山算法

  • 使用当前线程数(n)测量输出
  • 向池中添加+1个线程
  • 使用当前线程数(n+1)测量输出
  • 如果O(n+1)>O(n)
  • 返回步骤1
  • 否则,返回步骤1,但这次在步骤3释放一个线程,而不是创建一个新线程