一.简介
提供一个线程池,该线程池可用于执行任务、发送工作项、处理异步 I/O、代表其他线程等待以及处理计时器
注意:线程池中启动的线程都是后台线程
二.主要方法
| GetAvailableThreads(Int32, Int32) |   线程池中空闲线程数,检索由 GetMaxThreads(Int32, Int32) 方法返回的最大线程池线程数和当前活动线程数之间的差值。  |  
  
| GetMaxThreads(Int32, Int32) |   检索可以同时处于活动状态的线程池请求的数目。 所有大于此数目的请求将保持排队状态,直到线程池线程变为可用。  |  
  
| GetMinThreads(Int32, Int32) |   发出新的请求时,在切换到管理线程创建和销毁的算法之前检索线程池按需创建的线程的最小数量。  |  
  
| QueueUserWorkItem(WaitCallback) |   将方法排入队列以便执行。 此方法在有线程池线程变得可用时执行。  |  
  
| QueueUserWorkItem(WaitCallback, Object) |   将方法排入队列以便执行,并指定包含该方法所用数据的对象。 此方法在有线程池线程变得可用时执行。  |  
  
| SetMaxThreads(Int32, Int32) |   设置可以同时处于活动状态的线程池的请求数目。 所有大于此数目的请求将保持排队状态,直到线程池线程变为可用。  |  
  
| SetMinThreads(Int32, Int32) |   发出新的请求时,在切换到管理线程创建和销毁的算法之前设置线程池按需创建的线程的最小数量。  |  
  
三.使用
1.QueueUserWorkItem
(1)回调不带参数
        private static void fun2()
        {
            for (int i = 0; i < 10; i++)
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(t =>
                {
                    Console.WriteLine($"Thread ThreadId:{Thread.CurrentThread.ManagedThreadId}");
                }));
            }
        }
 
运行结果:

(2)回调带参数
        private static void fun1()
        {
            for (int i = 0; i < 10; i++)
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(t =>
                {
                    Console.WriteLine($"Thread {t} ThreadId:{Thread.CurrentThread.ManagedThreadId}");
                }), i);
            }
        }
 
运行结果:

四.workerThreads和completionPortThreads
CLR线程池分为工作者线程(workerThreads)与I/O线程(completionPortThreads)两种:
(1)workerThreads:工作者线程是主要用作管理CLR内部对象的运作,通常用于计算密集的任务。
(2)completionPortThreads:I/O(Input/Output)线程主要用于与外部系统交互信息,如输入输出。
参考:
https://www.cnblogs.com/kissdodog/archive/2013/03/28/2986026.html
