一、ThreadPool概述提供一个线程池,可以用来执行任务,发送工作项,处理异步I/O,代表其他线程等待,以及手柄计时装置。创建线程需要时间。如果有不同的小任务要做,可以提前创建很多线程/在该做的时候请求。无需自己创建这样的列表。该列表由ThreadPool类托管。此类将根据需要增加或减少池中的线程数,直至达到最大线程数。池中的最大线程数是可配置的。在双核CPU上,默认设置为1023个工作线程和1000个I/O线程。也可以指定创建线程池时应立即启动的最小线程数,以及线程池中可用的最大线程数。如果有更多的作业要处理,并且线程池中的线程数已达到限制,则最新的作业将排队等待线程完成任务。线程池使用简单,但有一些局限性:线程池中的所有线程都是后台线程。如果进程的所有前台线程都终止,则所有后台线程都将停止。进入池的线程不能更改为前台线程。您不能为池线程设置优先级或名称。对于COM对象,进入池的所有线程都是多线程单元(MTA)线程。许多COM对象需要单线程单元(MTA)线程。进入池的线程只能用于短期任务。如果线程要一直运行(比如Word的拼写检查线程),应该使用Thread类来创建线程。使用线程池线程的操作包括:当你创建一个Task或Task对象来异步执行某个任务task时,taskscheduler默认运行在一个线程池线程上。异步计时器使用线程池。线程池线程从System.Threading.Timer类执行回调,并从System.Timers.Timer类引发事件。使用已注册的等待句柄时,系统线程会监视等待句柄的状态。等待操作完成后,线程池中的工作线程会执行相应的回调函数。当您调用QueueUserWorkItem方法时,该方法将排队等待在线程池线程上执行。为此,向该方法传递一个WaitCallback委托。2.GetAvailableThreads(Int32,Int32)方法获取GetMaxThreads(Int32,Int32)方法返回的最大线程池线程数与当前活动线程数的差值。GetMaxThreads(Int32,Int32)检索可以同时处于活动状态的线程池请求数。所有大于此数量的请求都将保持排队状态,直到线程池线程可用为止。SetMaxThreads(Int32,Int32)设置可以同时处于活动状态的线程池请求数。所有大于此数量的请求都将保持排队状态,直到线程池线程可用为止。GetMinThreads(Int32,Int32)在发出新请求时,在切换到管理线程创建和销毁的算法之前,检索线程池按需创建的最小线程数。SetMinThreads(Int32,Int32)设置在切换到管理线程创建和销毁的算法之前发出新请求时线程池将按需创建的最小线程数。QueueUserWorkItem(WaitCallback,Object)排队执行方法,指定包含该方法使用的数据的对象。当线程池线程可用时执行此方法。RegisterWaitForSingleObject(WaitHandle,WaitOrTimerCallback,Object,Int32,Boolean)注册一个等待WaitHandle的委托,指定一个32位有符号整数,表示以毫秒为单位的超时值。3.获取线程数的方法inti=0;整数j=0;//前面是辅助(也就是所谓的worker)线程,后面是I/O线程ThreadPool.GetMaxThreads(outi,outj);安慰。WriteLine(i.ToString()+""+j.ToString());//默认为1000//获取空闲线程,由于现在不使用异步线程,所以为空ThreadPool.GetAvailableThreads(outi,outj);Console.WriteLine(i.ToString()+""+j.ToString());//默认为10004.QueueUserWorkItem(WaitCallback,Object)将方法排队执行,指定方法Object使用的数据。当线程池线程可用时执行此方法。publicstaticboolQueueUserWorkItem(System.Threading.WaitCallbackcallBack,objectstate);示例:staticvoidMain(string[]args){Personp=newPerson(1,"LiuBei");//启动工作线程ThreadPool.QueueUserWorkItem(newWaitCallback(RunWorkerThread),p);}staticvoidRunWorkerThread(objectobj){Thread.Sleep(200);Console.WriteLine("线程池线程启动!");Personp=objasPerson;Console.WriteLine(p.Name);}publicclassPerson{publicPerson(intid,stringname){Id=id;名字=名字;}publicintId{得到;放;}公共字符串名称{得到;放;五、RegisterWaitForSingleObject注册等待句柄注册一个等待WaitHandle委托,并指定一个数字来表示超时值(以毫秒为单位)。将指定的方法排队到线程池中。当超时或者等待委托接收到信号时,辅助线程会执行这个方法,即辅助线程什么时候开始执行由主线程控制。publicstaticSystem.Threading.RegisteredWaitHandleRegisterWaitForSingleObject(System.Threading.WaitHandlewaitObject,System.Threading.WaitOrTimerCallback回调,对象状态,intmillisecondsTimeOutInterval,boolexecuteOnlyOnce);要注册的参数waitObjectWaitHandle。使用WaitHandle而不是Mutex。callBack发出waitObject参数信号时调用的WaitOrTimerCallback委托。状态被传递给委托对象。millisecondsTimeOutInterval超时时间(以毫秒为单位)。如果millisecondsTimeOutInterval参数为0(零),函数将测试对象的状态并立即返回。如果millisecondsTimeOutInterval为-1,则函数的超时间隔永不过期。表示每隔几秒执行一次回调方法,也就是说在线程刚加入的时候,第一次执行回调方法需要几秒的时间。如果使用wait.Set()方法,则立即执行回调函数,无需等待。如果executeOnlyOnce为true,则表示调用delegate后,线程将不再等待waitObject参数;如果为false,则表示每次等待操作完成都会重置定时器,直到注销等待。返回一个RegisteredWaitHandle,封装了RegisteredWaitHandle的本机句柄。//TaskInfo包含将传递给回调方法的数据。publicclassTaskInfo{publicRegisteredWaitHandleHandle=null;公共字符串OtherInfo="默认";}publicstaticvoidMain(string[]args){//主线程使用AutoResetEvent向已注册的等待处理程序发出信号,该处理程序执行回调方法AutoResetEventev=newAutoResetEvent(false);TaskInfoti=newTaskInfo();ti.OtherInfo="第一个任务";//任务的TaskInfo包括RegisterWaitForSingleObject返回的注册等待句柄。这//允许在对象发出一次信号后终止等待(请参阅WaitProc)。ti.Handle=ThreadPool.RegisterWaitForSingleObject(ev,newWaitOrTimerCallback(WaitProc),0ti,false,10);//主线程等待三秒,以示队列中的线程超时,然后发送信号。线程.睡眠(3100);Console.WriteLine("主线程信号。");ev.Set();//发送信号//主线程休眠,应该给回调方法执行的时间。如果注释掉这一行,程序通常会在ThreadPool线程可以执行之前结束。线程.睡眠(1000);//如果您自己启动一个线程,您可以通过调用Thread.Join等待它结束。该选项不适用于线程池线程。}//回调方法在注册的等待超时时执行,//或在WaitHandle(在本例中为AutoResetEvent)发出信号时执行。//WaitProc在事件第一次发出信号时注销WaitHandle。publicstaticvoidWaitProc(objectstate,booltimedOut){TaskInfoti=(TaskInfo)state;字符串原因=“超时”;if(!timedOut)//如果Timeout为false,表示收到信号后Executed{cause="SIGNALED";//如果因为WaitHandle触发信号而执行回调方法,则使用未注册的等待句柄取消回调方法的后续执行if(ti.Handle!=null)ti.Handle.Unregister(null);//}Console.WriteLine("WaitProc({0})在线程{1}上执行;原因={2}。",ti.OtherInfo,Thread.CurrentThread.GetHashCode().ToString(),cause);//超时后执行结果如下:WaitProc(Firsttask)在线程7上执行;cause=TIMEDOUT.WaitProc(Firsttask)在线程7上执行;cause=TIMEDOUT.WaitProc(Firsttask)在线程7上执行;cause=TIMEDOUT.Mainthreadsignals.WaitProc(Firsttask)在线程7上执行;原因=信号。ThreadPool文章到此结束。希望对大家的学习有所帮助,希望大家多多支持。以上就是C#学习教程:C#多线程线程池ThreadPool详解和分享的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处: