控件中国网现已改版,您看到的是老版本网站的镜像,系统正在为您跳转到新网站首页,请稍候.......
中国最专业的商业控件资讯网产品咨询电话:023-67870900 023-67871946
产品咨询EMAIL:SALES@COMPONENTCN.COM

ASP.NET中WaitHandle类的使用方法

作者:不详 出处:IT专家网 2010年02月03日 阅读:

最近笔者在用.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)

  虽然觉得这有点复杂,但还是试了试。当程序运行时,碰到了一个问 题,如果WaitHandle数组超过64个元素之后,WaitHandle对象的WatiAll方法罢工了。后来为了程序能运行,只得想了一个笨办法: 先创建两个WaitHandle对象放在数组,然后用循环两个两个地运行任务。代码的思路大概是下面这样:

WaitHandle[] handles = new WaitHandle[]{new AutoResetEvent(false), new AutoResetEvent(false)};int times = (int)N/2;int i;for(i = 0; i < times; i++){ThreadPool.QueueUserWorkItem(new WaitCallback(Tasks[i*2]), handles[0]);   ThreadPool.QueueUserWorkItem(new WaitCallback(Tasks[i*2+1]), handles[1]);WaitHandle.WaitAll(handles);}if(i*2 < N){ThreadPool.QueueUserWorkItem(new WaitCallback(Tasks[i*2 + 1]), handles[0]);WaitHandle.WaitAny(handles);}

  虽然代码这么写比较复杂,但至少可以保证运行时不会出问题。但这么写代码显然并不KISS!于是问了问高手,说有个 RegisterWaitForSingleObject方法,但一看这个方法的参数列表就够让人晕的了。有点怀念Java了,记得Java中有个 CountDownLatch类,创建类的时候赋一个初始值X,然后主线程中调用await,线程池中跑的线程调用countDown方法。就可以实现主 线程等待X次countDown方法调用之后继续。这样既没有64个WaitHandle的限制,也不用去研究那个 RegisterWaitForSingleObject方法。不过问题在于.Net中并没有这么一个东西,只能自己动手了。

   class CountDownLatch {private object lockobj;private int counts;
  public CountDownLatch(int counts){this.counts = counts;}
  public void Await(){lock(lockobj){while(counts > 0){Monitor.Wait(lockobj);}}}
  public void CountDown(){lock(lockobj){counts--;Monitor.PulseAll(lockobj);}}}

  有了这个东西,上面的代码可以改的更少一些。

CountDownLatch cdl = new CountDownLatch(N);
for(int i = 0; i < N; i++){
ThreadPool.QueueUserWorkItem(new WaitCallback(Tasks[i]), cdl);
}
cdl.Awati();

  而对于任务的代码来说,在结尾处吧对WaitHandle的Set方法的调用改为对CountDownLatch类的CountDown方法的调用即可。

  最后,我想说的是其实没必要把思路都拘束在.Net上或者Java上,相互借鉴会让思路更开阔一些。

  不过有句心里话想说的就是,其实Java的类库在某些方面做的比.Net好一些。

热推产品

  • ActiveReport... 强大的.NET报表设计、浏览、打印、转换控件,可以同时用于WindowsForms谀坔攀戀Forms平台下......
  • AnyChart AnyChart使你可以创建出绚丽的交互式的Flash和HTML5的图表和仪表控件。可以用于仪表盘的创......
首页 | 新闻中心 | 产品中心 | 技术文档 | 友情连接 | 关于磐岩 | 技术支持中心 | 联系我们 | 帮助中心 Copyright-2006 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 电话:023 - 67870900 传真:023 - 67870270 产品咨询:sales@componentcn.com 渝ICP备12000264号 法律顾问:元炳律师事务所 重庆市江北区塔坪36号维丰创意绿苑A座28-5 邮编:400020
在线客服
在线客服系统
在线客服
在线客服系统