AutoResetEvent和ManualResetEvent用于多线程之间代码执行顺序的控制,它们继承自WaitHandle,API相同,但在使用中还是有区别的。

每次使用时虽然理解了,但由于没有去深入思考记忆,过几天又忘记了。到下次需要使用的时候又要重新去理解这2个类。

今天再次遇到他们,写下这篇随笔。。加深理解印象。以后不用去纠结他们了。

1.构造函数参数

var manualResetEventWaitHandle = new ManualResetEvent(true);

var autoResetEventResetEventWaitHandle = new AutoResetEvent(true);

MSDN的解释:True有信号,False无信号

为True,代码执行过程中遇到WaitHandle.WaitOne()的时候,(有了信号)不会阻塞该线程,将会继续执行下去。

如为False,遇到WaitHandle.WaitOne()的时,当前线程被挂起(没有信号,等待信号),直到另一个线程执行WaitHandle.Set(),线程才会继续执行WaitHandle.WaitOne后面的代码

2.Set和Reset方法

MSDN的解释:Set为终止状态(有信号),Reset设置为非终止状态(没有信号)

结合构造函数的参数这样比较好理解了。

var waitHandle = new ManualResetEvent/AutoResetEvent(false)

waitHandle.Set()

等价于

var waitHandle = new ManualResetEvent/AutoResetEvent(true)

同理

var waitHandle = new ManualResetEvent/AutoResetEvent(true)

waitHandle.Reset()

等价于

var waitHandle = new ManualResetEvent/AutoResetEvent(false)

3.AutoResetEvent和ManualResetEvent

轮到主角了。以地铁闸机为比喻,闸机开启(没有信号)  乘客来到闸机前无法通行(WaitOne),刷卡(Set)后,闸机关闭(有信号),乘客进入。然后闸机再开启(没信号),

高亮就是它们的区别了。可以想象一般情况下闸机是一个AutoResetEvent,每当通过一个客人后,闸机又开启,闸机遇到了故障第一个人刷卡进入后,闸机还是处于关闭,这样之后的乘客不用WaitOne可以继续进入

也就是

autoResetEventResetEventWaitHandle.Set()

等同于

manualResetEventWaitHandle.Set()

manualResetEventWaitHandle.Reset();

补充 ManualResetEventSlim

Framework4中的ManualResetEvent轻量级优化版,推荐使用

参考:

http://www.cnblogs.com/qingyun163/archive/2013/01/05/2846633.html

http://baike.baidu.com/link?url=Cu-Oakr8hkaYtpg9hPTMuuUtAiMdSBc-f_LCs3-dtWTcYSIvbl9b22AKi63MyZ3I9RtmYtUCnYtVFsjTrQiNVq

AutoResetEvent和ManualResetEvent理解的更多相关文章

  1. AutoResetEvent和ManualResetEvent理解 z

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

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

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

  3. C#理解AutoResetEvent和ManualResetEvent

    当在C#使用多线程时就免不了使用AutoResetEvent和ManualResetEvent类,可以理解这两个类可以通过设置信号来让线程停下来或让线程重新启动,其实与操作系统里的信号量很相似(汗,考 ...

  4. C#深入理解AutoResetEvent和ManualResetEvent

    当在C#使用多线程时就免不了使用AutoResetEvent和ManualResetEvent类,可以理解这两个类可以通过设置信号来让线程停下来或让线程重新启动,其实与操作系统里的信号量很相似(汗,考 ...

  5. 个人对AutoResetEvent和ManualResetEvent的理解

    一.作用 AutoResetEvent和ManualResetEvent可用于控制线程暂停或继续,拥有重要的三个方法:WaitOne.Set和Reset. 这三个方法的官方定义并不好理解,什么终止.非 ...

  6. [转]个人对AutoResetEvent和ManualResetEvent的理解

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

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

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

  8. C#AutoResetEvent和ManualResetEvent的区别

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

  9. 线程同步(AutoResetEvent与ManualResetEvent)

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

随机推荐

  1. JSON 解析的两种方法

    今天帮朋友看了下JSON解析结果············· eval解析JSON中的注意点 在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. ...

  2. dynamic的一些使用心得

    dynamic关键字才出来的时候,觉得真是没什么用,谁总是和com交互来交互去啊,唯恐避之不及啊. 后来逐渐算是有了一些使用心得,发现这货还真是犀利啊,故在此举几个例子,起抛砖引玉之用. 1.替代XX ...

  3. python中的内置函数,递归,递归文件显示(二),二分法

    1.部分内置函数 repr()显示出字符串的官方表示形式,返回一个对象的string形式 # repr 就是原封不动的输出, 引号和转义字符都不起作用 print(repr('大家好,\n \t我叫周 ...

  4. jQuery中animate与scrollTop、offset().top实例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. BootStrap框架引入文件

    bootstrap -- 框架 引入需要的  这是外网的------************************************************************* < ...

  6. 洛谷P2179 [NOI2012]骑行川藏(拉格朗日乘数法)

    题面 传送门 题解 看\(mashirosky\)大佬的题解吧--这里 //minamoto #include<bits/stdc++.h> #define R register #def ...

  7. dubbo服务器启动后报错端口被占用

    环境:maven工程,ssm框架,tomcat 情景:dubbo的服务注册方服务器启动 问题原因: 经过网络查找,结果是Root WebApplicationContext 启动了两次,第二次报错,d ...

  8. HTML02--引用样式、表格、列表、div布局

    接上一篇“HTML01随笔” 1.使用样式:    内联样式:标签中使用style属性    内部样式:<head>使用<style type="text/css" ...

  9. c/c++ int,float,short 大小端转换函数

    unsigned int(uint32_t)大小端转换函数 unsigned int BLEndianUint32(unsigned int value) { return ((value & ...

  10. VS 代码自动对齐快捷键

    全部代码代码自动对齐快捷键为 Ctrl + a(按后可松松手) + k(按后可松松手) + f