ThreadPool:提供一个线程池,该线程池可用于执行任务、发送工作项、处理异步 I/O、代表其他线程等待以及处理计时器。
ThreadPool类在需要时增减池中线程的线程数,直到最大的线程数(可通过ThreadPool.GetMaxThreads获得)。
将任务添加进线程池:
ThreadPool.QueueUserWorkItem(Callback);
重载:
ThreadPool.QueueUserWorkItem(Callback, state);
因为ThreadPool是静态类 所以不需要实例化.
回调方法:
必须匹配System.Threading.WaitCallback委托类型,其定义为 delegate void Callback(object state); 可以向方法传递一个state参数;若没有参数,默认传递null。
如下面的示例所示,在for循环中,调用ThreadPool.QueueUserWorkItem()方法,传递一个WaitCallBack类型的委托,将JobForAThread方法传递给线程池中的线程。在线程池收到这个请求时,会从池中选取一个线程来调用该方法。如果线程池还没有运行,则创建一个线程池,并启动第一个线程。如果线程池已经在运行,且有一个空线程来完成该任务,则把该任务传递给这个线程。
static void Main(string[] args)
{
int nWorkerThreads;
int nCompletionPortThreads;
ThreadPool.GetMaxThreads(out nWorkerThreads, out nCompletionPortThreads);
Console.WriteLine("Max worker threads: {0}, I/O completion threads: {1}", nWorkerThreads, nCompletionPortThreads);
for (int i = 0; i < 5; i++)
{
ThreadPool.QueueUserWorkItem(JobForAThread);
}
Thread.Sleep(1000);
Console.ReadKey();
}
static void JobForAThread(object state)
{
for (int i = 0; i < 3; i++)
{
//获取托管线程的唯一标识符
Console.WriteLine("Loop {0}, running inside pooled thread {1}", i, Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(50);
}
}
线程池的特点:
1 线程池中所有的线程都是后台线程。如果进程的前台线程都结束了,则所有的后台线程会停止;
2 不能给线程池中的线程设置优先级或名称;
3 入池的线程只能用于时间较短的任务,如果线程要一直运行,则使用Thread类创建一个线程。