首页 > 代码库 > 应用CLR的线程池

应用CLR的线程池

大家都知道这个线程的建立和销毁都需要很大的性能开销,当有比较多且不同的任务需要完成时,可以考虑使用线程池来管理这些线程。在以windows NT为内核的操作系统上每个进程都包含一个线程池,在线程池中存在许多可以被随时使用的线程,当应用程序使用时,可以从线程池中直接取出一个已经存在的线程,当某个线程使用完成后,不会立即销毁,而是放入线程池中等待下一次的使用。

在C#中,通过System .Threading.ThreadPool提供了以下的常用方法和说明。

方法名称说明
BindHandle将操作系统句柄绑定到ThreadPool。
GetAvailableThreads检索由GetMaxThreads方法返回的最大线程数和当前活动线程数之间的差值。
GetMaxThreads检索同时处于活动状态的线程池请求的数目,所有大于此数目的请求将保持排队状态,直到线程池线程变为可用。
GetMinThreads检索线程池在新请求预测中维护的空闲线程数。    
QueueUserWorkItem将方法排入队列以便执行,此方法在有线程池线程变得可用时执行。
RegisterWaitForSingleObject注册正在等待WaitHandle的委托。
SetMaxThreads设置可以同时处于活动状态的线程池的请求数目。所有大于此数目的请求将保持排队状态,直到线程池线程变得可用。
SetMinThreads设置线程池在新请求预测中维护的空闲线程数。
UnsafeQueueUserWorkItem注册一个等待WaitHandle的委托。
UnRegisterWaitForSingleObject将指定的委托排队到线程池。

举个例子:

 static void Main(string[] args)        {            int intWorkThreads;            int intCompletionPortThreads;            ThreadPool.GetMaxThreads(out intWorkThreads, out intCompletionPortThreads);            Console.WriteLine("最大工作线程数:{0},最大I/O线程数:{1}",intWorkThreads,intCompletionPortThreads);            //获取最大线程数的信息。            for (int i = 0; i < 3; i++)            {                ThreadPool.QueueUserWorkItem(TestThreadPool);//在线程池中申请使用线程。            }            Console.ReadLine();        }        static void TestThreadPool(object obj)        {            for (int i = 0; i < 3; i++)            {                //Thread.CurrentThread.ManagedThreadId获取正在运行的线程的标识。                Console.WriteLine("线程池中,正在运行的线程的唯一标识为{0}",Thread.CurrentThread.ManagedThreadId);            }            Thread.Sleep(100);        }

线程池中运行的线程都是后台线程,就是线程池中的所有线程的IsBackground属性都被设置为True,后台线程不会影响应用程序的结束,而前台的线程对应用程序的结束会有很大影响,因为应用程序的退出必须等待所有的前台线程结束。

应用CLR的线程池