参考:第三节:ThreadPool的线程开启、线程等待、线程池的设置、定时功能 - Yaopengfei - 博客园 (cnblogs.com)

C# AppDomain 详解_勇于尝试,却要三思后行。-CSDN博客_appdomain

一、为什么用线程池

1、因为线程的创建需要内存,太多线程会造成内存浪费

2、因为线程的销毁都需要耗费时间,

3、因为线程的调度执行会涉及线程上下文的切换,太多的线程这个过程会消耗性能(线程的管理消耗会变大)

 

 

 AppDomain、进程、线程关系:C# AppDomain 详解_勇于尝试,却要三思后行。-CSDN博客_appdomain

理论:

1、线程池的线程的数量最好由系统去分配,不要人为指定,因为线程池有一个内部机制:线程池创建一个线程去响应所有请求,当请求速度大于线程处理速度时,才会创建新的线程,

这样能在满足服务处理的情况下,最大程度减少线程开支,认为指定做不到这么精准高效

2、线程池的线程执行任务完毕后会返回线程池,进入空闲等待状态,等待响应其他请求,自身不会销毁,所以能减少性能损失。如果睡眠了太长时间,它会自己醒来,并销毁自身,允许系统回收线程使用的资源(包括内核对象、栈、TEB等)

3、线程池的线程默认为后台线程

4、线程池会快速创建工作者线程,使工作者线程的数量等于传给ThreadPool的SetMinThreads方法的值。如果从不调用这个方法(也建议你永远不调用这个方法),那么默认值等于你的进程允许使用的CPU数

5、通常,你的进程允许使用机器上的所有CPU®,所以线程池创建的工作者线程数量很快就会达到机器上的CPU数。创建了这么多(CPU数量)的线程后,线程池会监视工作项的完成速度。

      5.1如果工作项完成的时间太长(具体多长没有正式公布),线程池会创建更多的工作者线程。

      5.2如果工作项的完成速度开始变快,工作者线程会被销毁。

 

Demo地址:

https://files.cnblogs.com/files/summerZoo/ThreadPoolStudy.zip?t=1646912799