网上有很多AutoResetEvent和ManualResetEvent的详细介绍,在这里不做过多详细的解释,写下自己的一点心得留作备忘。

AutoResetEvent和ManualResetEvent都是事件锁,事件的功能就是可以在被监控者发生某种变化后立即通知监控者并做出相应反应。

在使用多线程过程中,锁几乎是不可缺少的一项,我们拿信号量和事件锁举例来说。

如果有一个厨师和一群顾客,如果是使用信号量的话,情况如下:顾客询问厨师:“饭做好了吗?”,厨师:“还没有好,等一会吧!”,顾客继续等待一段时间后继续询问,循环往复,直到饭做好后开始吃饭。

如果采用事件锁的话,情况如下:厨师告诉顾客:“你先等一会吧,饭做好后,我告诉你!”,顾客等待,厨师告诉顾客:“饭做好了,你过来吃吧!”,顾客吃饭。在这种模式下,使用事件锁就会好一些。

AutoResetEvent myAutoRetEvent = new AutoResetEvent(false);

ManualResetEvent myManualRetEvent = new ManualResetEvent(false);

//通知正在等待的线程已发生事件(厨师)

//构造函数函数变量如果为:false,初始状态非终止状态。厨师的初始状态就很忙碌,顾客如果要吃饭就要等待。

//构造函数变量如果为:true,初始状态为终止状态。厨师的初始状态为已经做好了饭,顾客可以直接吃饭。

/// <summary>
/// 通知正在等待的线程已发生事件 true:初始状态为终止状态 false:初始状态为非终止状态
/// 目前的初始状态未厨师没有做饭
/// </summary>
private AutoResetEvent myAutoRetEvent = new AutoResetEvent(false); private void button2_Click(object sender, EventArgs e)
{
Thread myThread = new Thread(new ThreadStart(RunStart));
myThread.Start();
//厨师做饭做了3000ms
Thread.Sleep();
//厨师告诉顾客饭做好了
myAutoRetEvent.Set();
} private void RunStart()
{
//顾客来了,要吃饭
myAutoRetEvent.WaitOne();
MessageBox.Show("吃饭...");
}

单击按钮后,等待3秒后,弹出“吃饭...”,如果把构造函数中的false改为true,单击按钮后,立即弹出“吃饭...”。

而ManualResetEvent与AutoResetEvent的区别是:前者(厨师做好饭后,所有的顾客都开始吃饭),而后者(厨师做好饭后,只有一个顾客能吃到饭。)

AutoResetEvent:

/// <summary>
/// 通知正在等待的线程已发生事件 true:初始状态为终止状态 false:初始状态为非终止状态
/// 目前的初始状态未厨师没有做饭
/// </summary>
private AutoResetEvent myAutoRetEvent = new AutoResetEvent(false); private void button3_Click(object sender, EventArgs e)
{
//来了一个顾客1
Thread myThread1 = new Thread(new ThreadStart(Run_1));
myThread1.Start();
//来了一个顾客2
Thread myThread2 = new Thread(new ThreadStart(Run_2));
myThread2.Start(); //厨师做饭做3000ms
Thread.Sleep();
//厨师做好饭了,通知看谁能吃上饭
myAutoRetEvent.Set();
} private void Run_1()
{
//顾客1过来了,要吃饭,等厨师做好饭
myAutoRetEvent.WaitOne();
MessageBox.Show("我是顾客1开始吃饭...");
} private void Run_2()
{
//顾客2过来了,要吃饭,等厨师做好饭
myAutoRetEvent.WaitOne();
MessageBox.Show("我是顾客2开始吃饭...");
}

ManualResetEvent:

private ManualResetEvent myManualRetEvent = new ManualResetEvent(false);

        private void button4_Click(object sender, EventArgs e)
{
//来了一个顾客1
Thread myThread3 = new Thread(new ThreadStart(Run_3));
myThread3.Start();
//来了一个顾客2
Thread myThread4 = new Thread(new ThreadStart(Run_4));
myThread4.Start(); //厨师做饭做3000ms
Thread.Sleep();
//厨师做好饭了,通知看谁能吃上饭
myManualRetEvent.Set();
} private void Run_3()
{
//顾客1过来了,要吃饭,等厨师做好饭
myManualRetEvent.WaitOne();
MessageBox.Show("我是顾客1开始吃饭...");
} private void Run_4()
{
//顾客2过来了,要吃饭,等厨师做好饭
myManualRetEvent.WaitOne();
MessageBox.Show("我是顾客2开始吃饭...");
}

厨师做好饭后,通知大家,所有等待的顾客都开始吃饭。两者的区别如上所述。

此篇文章是受csdn 陆敏技的文章启发,便于自己的理解记忆。

c# AutoResetEvent和ManualResetEvent的更多相关文章

  1. C#多线程同步事件及等待句柄AutoResetEvent 和 ManualResetEvent

    最近捣鼓了一下多线程的同步问题,发现其实C#关于多线程同步事件处理还是很灵活,这里主要写一下,自己测试的一些代码,涉及到了AutoResetEvent 和 ManualResetEvent,当然还有也 ...

  2. 多线程间通信之AutoResetEvent和ManualResetEvent的原理分析

    AutoResetEvent 允许线程通过发信号互相通信. 通常,当线程需要独占访问资源时使用该类. 线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号. 如果 AutoRe ...

  3. 个人对AutoResetEvent和ManualResetEvent的理解(转载)

    仅个人见解,不对之处请指正,谢谢. 一.作用 AutoResetEvent和ManualResetEvent可用于控制线程暂停或继续,拥有重要的三个方法:WaitOne.Set和Reset. 这三个方 ...

  4. AutoResetEvent和ManualResetEvent理解 z

    AutoResetEvent和ManualResetEvent用于多线程之间代码执行顺序的控制,它们继承自WaitHandle,API相同,但在使用中还是有区别的. 每次使用时虽然理解了,但由于没有去 ...

  5. C#AutoResetEvent和ManualResetEvent的区别

    一:终止状态和非终止状态 首先说说线程的终止状态和非终止状态.AutoResetEvent和ManualResetEvent的构造函数中,都有bool变量来指明线程的终止状态和非终止状态.true表示 ...

  6. 线程同步(AutoResetEvent与ManualResetEvent)

    前言 在我们编写多线程程序时,会遇到这样一个问题:在一个线程处理的过程中,需要等待另一个线程处理的结果才能继续往下执行.比如:有两个线程,一个用来接收Socket数据,另一个用来处理Socket数据, ...

  7. AutoResetEvent与ManualResetEvent区别

    本文来自:http://www.360doc.com/content/10/1126/10/3267996_72536817.shtml 在.Net多线程编程中,AutoResetEvent和Manu ...

  8. WaitHandle、AutoResetEvent、ManualResetEvent

    多线程中的锁系统(三)-WaitHandle.AutoResetEvent.ManualResetEvent 介绍 本章主要说下基于内核模式构造的线程同步方式,事件,信号量. 目录 一:理论 二:Wa ...

  9. 对比AutoResetEvent和ManualResetEvent

    ManualResetEvent和AutoResetEvent 比较 ManualResetEvent和AutoResetEvent都继承自EventWaitHandler,它们的唯一区别就在于父类 ...

随机推荐

  1. JS中Array数组的三大属性用法

    原文:JS中Array数组的三大属性用法 Array数组主要有3大属性,它们分别是length属性.prototype属性和constructor属性. JS操作Array数组的方法及属性 本文总结了 ...

  2. 框架Asp.net Identity

    框架Asp.net Identity 在Asp.net上,微软的membershop框架经历了Asp.net membership到Asp.net simple membership,再到现在的Asp ...

  3. Keil中使用宏编译来定义DEBUG输出

    使用宏编译来格式化调试信息,是一个不错的方法,即可以在需要的时候打印出信息,还可以格式化我们所需要的输出. #define DEBUG 1 #if (DEBUG == 1) #define DBG(A ...

  4. 开源Asp.Net MVC网上商城BrnShop

    开源Asp.Net MVC网上商城BrnShop正式发布,提供源码下载 BrnShop网上商城是以Asp.Net mvc3为基础开发的网上商城,源代码完全开源(企业版的源代码目前还没有完全整理完成,一 ...

  5. Web应用和RESTful架构

    Web应用和RESTful架构 单页Web应用 概述 单页Web应用并不是突然诞生的一门新技术,而是web展示的一种新的尝试.它将所有的动作局限于一个Web页面,在加载站点首页的时候就加载站点需要的J ...

  6. JS列表的下拉菜单组件(仿美化控件select)

    JS列表的下拉菜单组件(仿美化控件select) 2014-01-23 23:51 by 龙恩0707, 1101 阅读, 6 评论, 收藏, 编辑 今天是农历23 也是小年,在这祝福大家新年快乐!今 ...

  7. iOS基础 - iOS网络基础

    一.网络访问的四个步骤 l 第一步:确定地址URL l 第二步:建立请求 l 第三步:建立并启动连接 l 第四步:连接完成,处理结果 备注:URL,统一资源定位符(URL,英语Uniform Reso ...

  8. 在线压缩JS的工具

    给大家介绍款在线压缩JS的工具 首先说下该工具的域名:http://javascriptcompressor.com/ 进入后界面如下: 具体要讲下它的功能点:在线压缩 Javascript 源码可以 ...

  9. Asp.Net Web API 导航3

    Asp.Net Web API 导航   Asp.Net Web API第一课:入门http://www.cnblogs.com/aehyok/p/3432158.html Asp.Net Web A ...

  10. get 新技能

    找usaco各种月赛的数据戳这里:ace.delos.com/NOV06 这里表2006.11的数据,其余的数据同上搜索 月赛题目http://pan.baidu.com/share/link?sha ...