ASP.NET中的WaitHandle类
在.Net类库的文档中,有一个叫WaitHandle的类。这个类使用的时候需要为每个线程创建一个WaitHandle对象并把它们放在一个数组中,然后用WaitHandle类中的WaitAll方法来等待这些 WaitHandle被调用Set方法。
但当程序运行时,容易碰到这样一个问 题,如果WaitHandle数组超过64个元素之后,WaitHandle对象的WatiAll方法罢工了。有一个很笨的办法可以解决这个问题:先创建两个WaitHandle对象放在数组,然后用循环两个两个地运行任务。代码的思路大概是下面这样:
虽然代码这么写比较复杂,但至少可以保证运行时不会出问题。还有一个方法就是RegisterWaitForSingleObject方法..
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方法的调用即可。
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |