asp.net中ManualResetEvent类使用方法

ManualResetEvent详解

ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态,此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。一旦它被终止,ManualResetEvent 将保持终止状态(即对 WaitOne 的调用的线程将立即返回,并不阻塞),直到它被手动重置。可以通过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true;否则为 false。

ManualResetEvent例子

假设有一个程序中调用了三个异步方法,代码如下:

 

 代码如下 复制代码

public class Test
{
    public void Todo(string message)
    {
        Console.WriteLine("{0} {1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), message);
    }

    private Action<string> _todo = null;

    public Test()
    {
        _todo = Todo;
    }

    public IAsyncResult BeginTodo(string message, AsyncCallback callback, object state)
    {
        return _todo.BeginInvoke(message, callback, state);
    }

    public void EndTodo(IAsyncResult ar)
    {
        _todo.EndInvoke(ar);
    }
}

public class Program
{
    static void callback1(IAsyncResult ar)
    {
        Test test = (Test)ar.AsyncState;
        test.EndTodo(ar);
    }

    static void callback2(IAsyncResult ar)
    {
        Test test = (Test)ar.AsyncState;
        test.EndTodo(ar);
    }

    static void callback3(IAsyncResult ar)
    {
        Test test = (Test)ar.AsyncState;
        test.EndTodo(ar);
    }

    static public void Main(string[] args)
    {
        Test test1 = new Test();
        test1.BeginTodo("test1", callback1, test1);

        Test test2 = new Test();
        test2.BeginTodo("test2", callback2, test2);

        Test test3 = new Test();
        test3.BeginTodo("test3", callback3, test3);

        Console.ReadKey();
    }
}

执行结果如下图所示:

也就是说,异步方法的执行顺序是不固定的,但有时我们希望它们能按顺序执行,修改代码如下:

 

 代码如下 复制代码

public class Program
{
    static void callback1(IAsyncResult ar)
    {
        Test test = (Test)ar.AsyncState;
        test.EndTodo(ar);

        Test test2 = new Test();
        test2.BeginTodo("test2", callback2, test2);
    }

    static void callback2(IAsyncResult ar)
    {
        Test test = (Test)ar.AsyncState;
        test.EndTodo(ar);

        Test test3 = new Test();
        test3.BeginTodo("test3", callback3, test3);
    }

    static void callback3(IAsyncResult ar)
    {
        Test test = (Test)ar.AsyncState;
        test.EndTodo(ar);
    }

    static public void Main(string[] args)
    {
        Test test1 = new Test();
        test1.BeginTodo("test1", callback1, test1);        

        Console.ReadKey();
    }
}

看着有没有感觉很乱?能不能让代码既像开始那样有条理,又能按顺序执行呢?ManualResetEvent类出场了:

 

 代码如下 复制代码

public class Program
{
    static ManualResetEvent done1 = new ManualResetEvent(false);
    static ManualResetEvent done2 = new ManualResetEvent(false);
    static ManualResetEvent done3 = new ManualResetEvent(false);

    static void callback1(IAsyncResult ar)
    {
        Test test = (Test)ar.AsyncState;
        test.EndTodo(ar);
        done1.Set();
    }

    static void callback2(IAsyncResult ar)
    {
        Test test = (Test)ar.AsyncState;
        test.EndTodo(ar);
        done2.Set();
    }

    static void callback3(IAsyncResult ar)
    {
        Test test = (Test)ar.AsyncState;
        test.EndTodo(ar);
        done3.Set();
    }

    static public void Main(string[] args)
    {
        Test test1 = new Test();
        test1.BeginTodo("test1", callback1, test1);
        done1.WaitOne(); //阻塞当前线程,待Set后继续执行

        Test test2 = new Test();
        test2.BeginTodo("test2", callback2, test2);
        done2.WaitOne(); //阻塞当前线程,待Set后继续执行

        Test test3 = new Test();
        test3.BeginTodo("test3", callback3, test3);
        done3.WaitOne(); //阻塞当前线程,待Set后继续执行

        Console.ReadKey();
    }
}

时间: 2024-11-03 21:37:49

asp.net中ManualResetEvent类使用方法的相关文章

ASP.NET中单态类的方法并发访问的会有问题么?

问题描述 ImportsSystem.Data.OleDbPublicClassTestModulePrivateSharedunlockMLAsTestModule=NothingPrivateSharedReadOnlyobjAsObject=NewObjectPublicSharedFunctionGetInstance()AsTestModuleSyncLockobjIfunlockMLIsNothingThenunlockML=NewTestModuleEndIfReturnunloc

ASP.NET中基类Page_Load方法后执行的原因

加载对应Load事件和OnLoad方法,对于这个事件,相信大多数朋友都会比较熟悉,用VS.Net生成的页面中的Page_Load方法就是响应Load事件的方法,对于每一次请求,Load事件都会触发,Page_Load方法也就会执行,相信这也是大多数人了解ASP.Net的第一步. Page_Load方法响应了Load事件,这个事件是在System.Web.WebControl.Control类中定义的(这个类是Page和所有服务器控件的祖宗),并且在OnLoad方法中被触发. 很多人可能碰到过这样

ASP.NET中几种加密方法

MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由Mit Laboratory for Computer Science和Rsa data security inc的Ronald l. rivest开发出来,经md2.md3和md4发展而来.它的作用是让大容量信息在用数字签名软件签署私人密匙前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数).不管是md2.md4还是md5,它们都需要获得一个随机长度的信息并产

PHP模拟asp.net的StringBuilder类实现方法_php技巧

本文实例讲述了PHP模拟asp.net的StringBuilder类实现方法.分享给大家供大家参考.具体如下: 在asp.net开发开发环境中,有一个StringBuilder类是比较常用的, 这个类用起来可以实现很方便的text文本的操作. 但是在php中,没有这个类. 不过我们却可以通过自定义类来模拟这个方法. /******************************************** * * 函数名:StringBuilder * 作 用:构造PHP下的StringBuil

ASP.net中网站访问量统计方法代码_实用技巧

一.建立一个数据表IPStat用于存放用户信息 我在IPStat表中存放的用户信息只包括登录用户的IP(IP_Address),IP来源(IP_Src)和登录时间(IP_DateTime),些表的信息本人只保存一天的信息,如果要统计每个月的信息则要保存一个月.因为我不太懂对数据日志的操作,所以创建此表,所以说我笨吧,哈哈. 二.在Global.asax中获取用户信息 在Global.asax的Session_Start即新会话启用时获取有关的信息,同时在这里实现在线人数.访问总人数的增量统计,代

ASP.NET中实现获取调用方法名_实用技巧

本文实例讲述了ASP.NET中实现获取调用方法名的技巧.分享给大家供大家参考.具体实现方法如下: 在写记录日志功能时,需要记录日志调用方所在的模块名.命名空间名.类名以及方法名,想到使用的是反射(涉及到反射请注意性能),但具体是哪一块儿还不了解,于是搜索,整理如下:   需要添加相应的命名空间: 复制代码 代码如下: using System; using System.Diagnostics; using System.Reflection; 如果仅是获取当前方法名,可以使用如下代码: 复制代

javascript中定义类的方法详解

 这篇文章主要详细介绍了javascript中定义类的方法的相关资料,需要的朋友可以参考下     JS中定义类的方式有很多种: 1.工厂方式   代码如下: function Car(){ var ocar = new Object; ocar.color = "blue"; ocar.doors = 4; ocar.showColor = function(){ document.write(this.color) }; return ocar; } var car1 = Car(

scanner-Java基础学习中Scanner类nextInt方法问题

问题描述 Java基础学习中Scanner类nextInt方法问题 import java.util.*; public class Practice { public static String prompt = "How are you? "; public static void main(String[] args) { Scanner console = new Scanner(System.in); System.out.print(prompt); //int year=

java中一个类的方法与方法之间可以有联系,也可以相互孤立吗

问题描述 java中一个类的方法与方法之间可以有联系,也可以相互孤立吗 java中一个类的方法与方法之间可以有联系,也可以相互孤立吗什么情况要孤立,什么情况要有联系呢 解决方案 看需求.比如说class A{ float get长度() { ... } float get宽度() { ... } float get面积() { return get长度()*get宽度(); }}这里就需要调用另外两个方法 解决方案二: 现在还有人有这玩意嘛 解决方案三: 类的方法主要是对属性的一些操作,方法作用