标签:
AutoResetEvent和ManualResetEvent用于多线程之间代码执行顺序的控制,它们继承自WaitHandleAPI类似,使用中还是有区别的。
之前每次需要使用的时候,都去找他们之间的区别。虽然当时是明白了,但没有深入理解透彻,过几天又忘记了。等到下次需要使用的时候又要重新去理解这2个类。
今天再次遇到他们,写下这篇随笔。。加深理解印象。到了下次再用到不用再去纠结区别了。
var manualResetEventWaitHandle = new ManualResetEvent(true);
var autoResetEventResetEventWaitHandle = new AutoResetEvent(true);
MSDN的解释:是否设置为终止状态。
这也是一个容易引起混淆的地方。可以这么个记法。True不阻塞线程。
代码执行过程中遇到WaitHandle.WaitOne()的时候,这句话不会阻塞该线程,将会继续执行下去。
如为False,遇到WaitHandle.WaitOne()的时,当前线程被挂起,直到另一个线程执行WaitHandle.Set(),线程才会继续执行WaitHandle.WaitOne后面的代码
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)
轮到主角了。以地铁闸机为比喻,闸机开启(非终止) 乘客来到闸机前无法通行(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