网上有很多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. JavaScript随记汇总

    1.<script>标签嵌套,浏览器无法正常解析的问题: 百度知道回答 <script>FTAPI_slotid = 1007894;FTAPI_sync = true< ...

  2. Google Maps API Web Services

    原文:Google Maps API Web Services 摘自:https://developers.google.com/maps/documentation/webservices/ Goo ...

  3. 加载xib文件的两种方式

    一.加载xib文件的两种方式 1.方法一(NewsCell是xib文件的名称) NSArray *objects = [[NSBundle mainBundle] loadNibNamed:@&quo ...

  4. WCF与Web API 区别

    WCF与Web API 区别(应用场景)   Web api  主要功能: 支持基于Http verb (GET, POST, PUT, DELETE)的CRUD (create, retrieve, ...

  5. W5500问题集锦(一)

    在"WIZnet杯"以太网技术竞赛中,有非常多參赛者在使用中对W5500有各种各样的疑问,对于这款WIZnet新推出的以太网芯片,使用中大家是不是也一样存在下面问题呢?来看一看: ...

  6. IntelliJ IDEA 13 破解安装(JRebel 5.6.3a皴)

    首先安装IntelliJ 13,记住下载Ultimate Edition版本号,否则就必须打破..   安装到本地.然后一些配置(这一步不能.不过考虑到交换系统后,保存,建议做) 打开{install ...

  7. .Net IOC 之Unity

    .Net IOC 之Unity 在码农的世界里,为了应付时常变更的客户需求,增加的架构的客扩展性,减少工作量.IOC诞生了,它是一种可以实现依赖注入和控制对象生命周期的容器.最为一个有节操.有追求的码 ...

  8. ExtJS4 自己定义基于配置的高级查询1

    今天在编码过程中遇到一个问题,临时还没解决,先记录下来 上面是我做的高级查询面板..字段名和值都是读取配置文件,依据用户选择不同的字段名,自己主动载入不同的值列表,关系是与或 问题来了,我在字段名那个 ...

  9. 自己编译的openwrt在开机时一直打印jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found...的错误提示

    具体的输入信息是这样的. uboot> http Link down: eth0 Ethernet mode (duplex/speed): / Mbps HTTP server is star ...

  10. ReSharper 8.1支持Visual Studio 2013的特色——超强滚动条

    自ReSharper 8.1发布以来,便支持Visual Studio 2013.其中peek功能是它的亮点,滚动条则是它的特色. 接下来小编将展示ReSharper在Visual Studio 20 ...