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) |