在c#多线程编程中经常要使用线程,但是因为得线程的创建和撤销是非常消耗资源的代价很大,因此我们使用线程池来解决这个问题,
线程池就是在一开始向系统申请一定数量的线程,并维护它,有任务来时,如果有空闲线程的话就分配一个线程给它执行,如果没有空闲的线程就得等待。
当线程执行完任务后,就归还给空闲线程。
配置线程池的一些参数
RegisteredWaitHandle rhw; public void begin() { //ThreadPool.QueueUserWorkItem(new WaitCallback(CountProcess)); //检查线程是否结束 ThreadPool.SetMaxThreads(10, 10); ThreadPool.SetMinThreads(2, 2); rhw = ThreadPool.RegisterWaitForSingleObject(new AutoResetEvent(false), this.CheckThreadPool, null, 1000, false); }这个方法是添加一个任务
ThreadPool.QueueUserWorkItem(new WaitCallback(test),obj);
public void test(Object n) { for (int i = 0; i < int.Parse(n.ToString()); i++) { Thread.Sleep(1000); } AddMessage(Thread.CurrentThread.Name + " 结束! 执行参数为:"+n); }
我们需要判断线程池是否执行结束,就要判断最大线程数和空闲线程数是否相同,如果相同表示现在没有任务执行,因此任务执行完成
//检查线程池的方法 private void CheckThreadPool(object state, bool timeout) { int workerThreads = 0; int maxWordThreads = 0; //int int compleThreads = 0; ThreadPool.GetAvailableThreads(out workerThreads, out compleThreads); ThreadPool.GetMaxThreads(out maxWordThreads, out compleThreads); //当可用的线数与池程池最大的线程相等时表示线程池中所有的线程已经完成 if (workerThreads == maxWordThreads) { //当执行此方法后CheckThreadPool将不再执行 rhw.Unregister(null); //此处加入所有线程完成后的处理代码 AddMessage("所有线程结束!"); } }
上面简单的介绍了 C#中 ThreadPool的基本使用方法