Chinaunix首页 | 论坛 | 博客
  • 博客访问: 58002
  • 博文数量: 20
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 282
  • 用 户 组: 普通用户
  • 注册时间: 2014-11-20 17:23
个人简介

我的博客园;http://www.cnblogs.com/geekpaul/

文章分类

全部博文(20)

文章存档

2015年(7)

2014年(13)

我的朋友

分类: C#/.net

2015-02-25 12:44:02

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

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轻量级优化版,推荐使用。
阅读(850) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~