最近笔者在用.Net写程序时遇到一个问题:有N个互不相关的任务要在线程池中跑,但有一个线程要等待N个任务完成之后才能继续。而这个N是个未知数,可能会 很大(因此才会想到使用线程池而不是手动去new一个therad)。翻了翻.Net类库的文档,发现一个叫WaitHandle的类。这个类的用法挺有 意思,需要为每个线程创建一个WaitHandle对象并把它们放在一个数组中,然后用WaitHandle类中的WaitAll方法来等待这些 WaitHandle被调用Set方法。(代码就不写了,可以参考MSDN http://msdn.microsoft.com/zh-cn/library /system.threading.waithandle.aspx)
我们提供的服务有:成都网站制作、做网站、微信公众号开发、网站优化、网站认证、魏县ssl等。为超过千家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的魏县网站制作公司
虽然觉得这有点复杂,但还是试了试。当程序运行时,碰到了一个问 题,如果WaitHandle数组超过64个元素之后,WaitHandle对象的WatiAll方法罢工了。后来为了程序能运行,只得想了一个笨办法: 先创建两个WaitHandle对象放在数组,然后用循环两个两个地运行任务。代码的思路大概是下面这样:
WaitHandle[] handles = new WaitHandle[]{ |
虽然代码这么写比较复杂,但至少可以保证运行时不会出问题。但这么写代码显然并不KISS!于是问了问高手,说有个 RegisterWaitForSingleObject方法,但一看这个方法的参数列表就够让人晕的了。有点怀念Java了,记得Java中有个 CountDownLatch类,创建类的时候赋一个初始值X,然后主线程中调用await,线程池中跑的线程调用countDown方法。就可以实现主 线程等待X次countDown方法调用之后继续。这样既没有64个WaitHandle的限制,也不用去研究那个 RegisterWaitForSingleObject方法。不过问题在于.Net中并没有这么一个东西,只能自己动手了。
class CountDownLatch { |
有了这个东西,上面的代码可以改的更少一些。
|
而对于任务的代码来说,在结尾处吧对WaitHandle的Set方法的调用改为对CountDownLatch类的CountDown方法的调用即可。
最后,我想说的是其实没必要把思路都拘束在.Net上或者Java上,相互借鉴会让思路更开阔一些。不过有句心里话想说的就是,其实Java的类库在某些方面做的比.Net好一些。
【编辑推荐】
网站标题:分析.NET中的CountDownLatch类
转载来源:http://www.shufengxianlan.com/qtweb/news10/552760.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联