关于CLR线程池方面,该如何处理

关于CLR线程池方面
关于CLR线程池方面,该如何处理

图中的红色框处没太明白。

CLR初始化时,线程池中没有线程。当收到应用程序请求时,此时进行图中红色区域的操作。
我想问下,那句话的意思是:
1、线程池中的线程都在忙,所以才要新创建一个线程,来执行响应的操作。
2、线程池就没有线程,所以必须创建一个。然后执行完操作后,返回线程池。等待下次的请求。如果下次请求一个线程处理不了,再进行额外的创建,比如创建2个。这样在新创建的2个线程执行完后,又返回到线程池中,这时候线程池中有3个。

请问,那句话的意思是2么?

另外还想问一个问题,关于BackGroundWorker和new Thread(xxx).IsBackground=true这两个之间的区别。BackGroundWorker的原理是不是就是new一个Thread,设置其为后台线程,然后再加上一些相关的操作(方法、属性)就是现在的BackGroundWorker类?
------解决方案--------------------
引用:
请问,那句话的意思是2么?

如果线程池中没有可用线程,就新创建一个线程。

引用:
BackGroundWorker的原理是不是就是new一个Thread,设置其为后台线程,然后再加上一些相关的操作(方法、属性)就是现在的BackGroundWorker类?

BackGroundWorker应该用了线程池线程(不是显式地new一个Thread)。
但的确是在后台线程的基础上加一些相关操作。

------解决方案--------------------
.net 线程是用WINAPI管理的,LZ知道结论就行,不要纠结实现过程。 关于CLR线程池方面,该如何处理
------解决方案--------------------
线程池是有最大最小容量的,可以用这两个方法查到:


            int threads;
            int ioTHreads;
            ThreadPool.GetMinThreads(out threads, out ioTHreads);
            ThreadPool.GetMaxThreads(out threads, out ioTHreads);


一开始线程池是空的。因为最大值是三千多,一次过都创建出来就太浪费了,而且在绝大多数的情况之下不需要。

如果在允许范围之内,没有线程,或者没有空闲线程。则会创建一个新的线程。
用完之后它不会销毁,直接回到线程池

但是,如果达到或者超过允许范围,后面来的 task 都要排队,线程池不会再创建新线程
------解决方案--------------------
引用:
线程池是有最大最小容量的,可以用这两个方法查到:


            int threads;
            int ioTHreads;
            ThreadPool.GetMinThreads(out threads, out ioTHreads);
            ThreadPool.GetMaxThreads(out threads, out ioTHreads);


一开始线程池是空的。因为最大值是三千多,一次过都创建出来就太浪费了,而且在绝大多数的情况之下不需要。

如果在允许范围之内,没有线程,或者没有空闲线程。则会创建一个新的线程。
用完之后它不会销毁,直接回到线程池

但是,如果达到或者超过允许范围,后面来的 task 都要排队,线程池不会再创建新线程


回到线程池如果不用的话也是会自动销毁的吧?
------解决方案--------------------
1.楼主可以看一些操作系统的知识~了解一下为什么要有线程~
我是看《操作系统之哲学原理》

2.然后在看《clr via c》这本书~


好吧,开始回答楼主的问题~
你把线程想象成酒店的服务员~

当一个土豪带一群朋友来吃饭,
一个服务员应付不过来,那酒店就再派一个去服务她们~ 
还应付不过来那就再派一个他们....

有了这样的想象后,再来类比~
当计算机的任务很多的时候~ 可以创建线程(虚拟CPU)但线程的创建是很昂贵的~(招服务员)
所以就需要酒店经理(线程池)来管理服务员(线程)【最大可能重复利用,安排空闲地去工作,而不是不停地招】

而你.NET开发者~作为酒店的CEO,只要告诉酒店经理有个土豪要来酒店~要他好好安排一下服务员的问题~