我在Reed Copsey的以下答案中阅读了以下段落:
Will values in my ThreadStatic variables still be there when cycled via ThreadPool?
线程池(按设计)使线程在调用之间保持活动状态。 这意味着ThreadStatic变量将在调用之间保持不变 到QueueUserWorkItem。
这种行为也是你不应该依赖的。该 ThreadPool将(最终由其自行决定)释放线程 并让它们结束,并根据需要构建新的线程。
在什么条件下线程池最终构造新线程而不是重用它们?
答案 0 :(得分:2)
正如阿德里亚诺所说,这是一个你不应该担心的实施细节。但是,出于好奇心的考虑,这是我能找到的ThreadPool如何工作的最佳解释(来自Throttling Concurrency in the CLR 4.0 ThreadPool):
为了克服先前实现的一些限制,CLR 4.0引入了新的想法。从控制理论领域考虑的第一种方法是Hill Climbing(HC)算法。该技术是基于输入 - 输出反馈回路的自动调谐方法。系统输出以较小的时间间隔进行监视和测量,以查看受控输入的影响,并将该信息反馈到算法中以进一步调整输入。将输入和输出视为变量,系统根据这些变量建模为函数。
简单地说,一下,爬山算法,
答案 1 :(得分:1)
未经证实的AFAIK'条件。
首先考虑至少有4个常用的CLR hosting providers(ASP.Net, IE, shell exes和SQLCLR),每个都有自己的政策。例如,SQLCLR托管使用SQL Server自己的Thread and Task architecture,并通过缩小池(所有类型的池,包括线程)对OS signals of pressure作出反应。
那么为什么不假设线程总是回收并且你是正确的(即不要在池拥有的线程上保持状态)。