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

最新文章

  1. HTTP Session、Cookie机制详解
  2. [LintCode] Climbing Stairs 爬梯子问题
  3. 绑定: DataContextChanged, UpdateSourceTrigger, 对绑定的数据做自定义转换
  4. Android 扫一扫----ZXing 的使用
  5. jQuery设置和获取以及修改class name值操作
  6. 【洛谷 P3385】模板-负环(图论--spfa)
  7. Android 手机卫士12--进程管理
  8. 李洪强漫谈iOS开发[C语言-005]-程序结构分析
  9. UVa Problem 10132 File Fragmentation (文件还原) 排列组合+暴力
  10. BI与大数据
  11. [原创]从Confluence获取html table并将其序列化为C#类文件的工具
  12. Chapter4:表达式
  13. node安装插件方法
  14. MySql单表最大8000W+ 之数据库遇瓶颈记
  15. checkbox和radio元素的样式设置(简易版)
  16. JavaScript中易混淆的DOM属性及方法对比
  17. Oracle的安装+PL安装+系统变量配好后重启
  18. eclipse创建scrapy项目
  19. mysql 导入sql 2006 - mysql server has gone away 导入
  20. linux关机、重启命令

热门文章

  1. c#去除DataTable空列
  2. ES6学习之const声明常量的学习
  3. c语言博客作业06-文件
  4. 1、认识Redis
  5. markdown字体或者图片居中
  6. C# RDLC报表不出现预览窗体直接输出到打印机
  7. Python(re模块,正则)
  8. Using RDP to connect Windows remote desktop with Linux
  9. 代码审计就该这么来3 beescms getshell
  10. FTP枢轴攻击