码迷,mamicode.com
首页 > 其他好文 > 详细

AutoResetEvent和ManualResetEvent理解

时间:2015-02-17 23:33:06      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:

AutoResetEvent和ManualResetEvent用于多线程之间代码执行顺序的控制,它们继承自WaitHandleAPI类似,使用中还是有区别的。

之前每次需要使用的时候,都去找他们之间的区别。虽然当时是明白了,但没有深入理解透彻,过几天又忘记了。等到下次需要使用的时候又要重新去理解这2个类。

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

 

 

1.构造函数参数

var manualResetEventWaitHandle = new ManualResetEvent(true);

var autoResetEventResetEventWaitHandle = new AutoResetEvent(true);

MSDN的解释:是否设置为终止状态。

这也是一个容易引起混淆的地方。可以这么个记法。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();

 

参考:

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

AutoResetEvent和ManualResetEvent理解

标签:

原文地址:http://www.cnblogs.com/miku/p/4295533.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!