ASP.NET教程:WaitHandle类

当程序运行时,碰到了一个问 题,如果WaitHandle数组超过64个元素之后,WaitHandle对象的WatiAll方法罢工了。后来为了程序能运行,只得想了一个笨办法: 先创建两个WaitHandle对象放在数组,然后用循环两个两个地运行任务。

最近笔者在用.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好一些。
 

时间: 2024-10-23 01:47:34

ASP.NET教程:WaitHandle类的相关文章

[ASP.NET 教程] 二. Web Forms

asp.net|web|教程 1. 服务器端处理 虽然form.html能够通过post或者get方法产生回发,但是它仍然不能够处理用户输入,仍然是一个静态页面,现在我们需要在服务器端处理用户输入及回发.在服务器端处理用户输入有很多方式,因为本文是ASP.NET教程,故只谈ASP.NET.ASP.NET使用Web Form来描述Web页面,通过面向对象的编程方式,配合.NET Framework,使Web应用程序设计变得更简单,更高效,功能更为强大.2. Web Forms 先从一个简单的示例程

ASP入门教程-VBScript概述

1.VBScript简介 VBScript是一种脚本语言,也是ASP的默认语言,可以在HTML文件中直接嵌入VBScript脚本,从而扩展HTML,使它不仅仅是一种页面格式语言.带有VBScript脚本的网页可以对用户的操作作出反应. 2.HTML页面中添加VBScript代码 VBSript脚本作为HTML文档的一部分页存在.也就是说,这些代码必须放在HTML文档中才能执行.脚本代码可以放在HTML文档的任何位置,即BODY或HEAD部分之中.通常是将脚本代码集中放在HEAD部分中,这样能确保

ASP.NET教程:汇总前台代码绑定后台变量的方法

经常会碰到在前台代码中要使用(或绑定)后台代码中变量值的问题.一般有<%= str%>和<%# str %>两种方式,这里简单总结一下.如有错误或异议之处,敬请各位指教. 一方面,这里所讲的前台即通常的.aspx文件,后台指的是与aspx相关联的CodeBehind,文件后缀名为.aspx.cs:另一方面,这里的绑定是指用户发出访问某一页面指令后,服务器端在执行过程中就已经将前台代码进行了赋值,而后生成html格式回传客户端显示,而并非已经显示到客户端后,然后通过其他方法(如aja

ASP+中文教程(一)--asp+简介、安装、以及如何显示中文

asp+|教程|显示|中文 ASP+ 中文教程-----asp+简介.安装.以及如何显示中文 终于空下一段时间,可以学一些新东西,看了一下有关asp+的相关资料,觉得很值得学一下,所以就一边学习一边写下这个教程,对于自己来说,可以作为学习笔记,对于别人,尤其是那些E文不太好的朋友可以作为一个可看的中文资料吧,起个抛砖引玉的作用.由于水平所限,错误在所难免,希望大家能批评指正.首先我将讲一下什么是asp+ , 然后我会结合NGWS自带的例子具体讲一下asp+的应用.由于平常用C较多,所以所有例子都

asp+中文教程(二)-- Asp+ Web Forms

asp+|web|教程|中文 二.ASP + Web Forms ASP + Web Forms ,一个微软的新名词,照它自己的话说,ASP + Web Forms页面框架是一个可升级的NGWS runtime编程模型,可以在服务器上动态产生网页.不太好懂是吗,其实说白了,和HTML的表单一样,但它可以在服务器端动态改变,而不象静态HTML表单那样一旦生成就无法改变,当然,用DHTML或remote script也可以做到动态改变,但毕竟不是很方便.那么,究竟Web Forms是个什么样呢?其实

ASP.NET教程:多个Set排列算法

ASP.NET教程:多个Set排列算法 using System; using System.Text; using System.Collections; using System.Collections.Generic; public class Test{ public static void Main(string [] args){     string CheckDefault="A,B,C;D,E;G,F,J";     string[] Lists=CheckDefau

asp分页的一个类

分页 asp分页的一个类, 在50,000条记录下测试过,速度比ado的那个要快多了 <% '************************************************************************************'具体用法'Set conn=Server.CreateObject("ADODB.Connection")'conn.open "DRIVER={SQL Server};SERVER=(local);UID=s

ASP中的Debug类(VBScript)

debug|vbscript 不知道用ASP写代码的朋友是不是和我有一样的感受,ASP中最头疼的就是调试程序的时候不方便,我想可能很多朋友都会用这样的方法"response.write ",然后输出相关的语句来看看是否正确.前几天写了一个千行的页面,里面大概有七八个SUB/FUNCTION,调试的时候用了有三十几个response.write ,天,调试完后把这三十个一个个删除,累! 今天看到一个ASP中的Debug类(VBS),试用了一下,绝! 使用方法很简单: test.asp &

ASP基础教程之学习ASP中子程序的应用

程序|基础教程 在ASP中,你可通过VBScript和其他方式调用自程序. 实例: 调用使用VBScript的子程序 如何从ASP调用以VBScript编写的子程序.  <html> <head><%sub vbproc(num1,num2)response.write(num1*num2)end sub%></head> <body><p>You can call a procedure like this:</p>&l