天天看点

5天不再惧怕多线程——第五天 线程池

说到多线程,不可不说线程池,c#中关于池的概念很多,今天来整理下threadpool的使用。

是的,如果你很懒,如果你的执行任务比较短,如果你不想对线程做更精细的控制,那么把这些繁琐的东西丢给线程池吧。

一:threadpool

好了,下面看看theadpool下有哪些常用的方法。

1:getmaxthreads,getminthreads

首先我们肯定好奇线程池到底给我们如何控制线程数,下面就具体的看一看。

5天不再惧怕多线程——第五天 线程池

有的同学可能就要问,我可以将1023设置为10230吗?那么就会有10230个线程帮我做事多好啊,其实不然。

①:我先前的文章也说过,线程很多的话,线程调度就越频繁,可能就会出现某个任务执行的时间比线程调度花费的时间短很多的尴尬局面。

②:我们要知道一个线程默认占用1m的堆栈空间,如果10230个线程将会占用差不多10g的内存空间,我想普通的电脑立马罢工。

2:setmaxtheads,setminthreads

当然,默认的线程设置只是一个参考,如果我们处于性能和实际情况确实需要修改也没关系,framework也给我们提供了现成的方法。

5天不再惧怕多线程——第五天 线程池

3: queueuserworkitem

需要容纳任务并执行的方法来了,该方法有一个waitcallback的委托,我们只需要把将要执行的任务丢给委托,clr将会在线程池中调派空闲的

线程执行。

5天不再惧怕多线程——第五天 线程池

可能我们也需要像普通的thread一样带一些参数到工作线程中,queueuserworkitem的第二个重载版本解决了我们的问题。

4:registerwaitforsingleobject

我们知道,如果我们把要执行的任务丢给线程池后,相当于把自己的命运寄托在别人的手上。

①:我们再也不能控制线程的优先级了。

②:丢给线程池后,我们再也不能将要执行的任务取消了。

是的,给别人就要遵守别人的游戏规则,不过registerwaitforsingleobject提供了一些简单的线程间交互,因为该方法的第一个参数是

waithandle,在vs对象浏览器中,我们发现eventwaithandle继承了waithandle,而manualresetevent和autoresetevent都继承于

eventwaithandle,也就是说我们可以在registerwaitforsingleobject溶于信号量的概念。

5天不再惧怕多线程——第五天 线程池

我们知道在threading下面有一个timer计时器,当定期触发任务的时候都是由线程池提供并给予执行,那么这里我们溶于信号量的概念以后同样

可以实现计时器的功能。

5天不再惧怕多线程——第五天 线程池

有时候,跑着跑着我们需要在某个时刻停止它,没关系,registerwaitforsingleobject返回一个registeredwaithandle类,那么我们就通过

registeredwaithandle来动态的控制,比如说停止计数器的运行。

5天不再惧怕多线程——第五天 线程池