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)后,闸机关闭(有信号),乘客进入。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. 关于Java中进程和线程的详解
  2. c# Winform 开发分屏显示应用程序
  3. [USACO2009 NOV GOLD]奶牛的图片
  4. mysql 如何设置自动增长序列 sequence(一)
  5. 12.Android之Tabhost组件学习
  6. import Tkinter的时候报错
  7. BZOJ 3207 花神的嘲讽计划Ⅰ(函数式线段树)
  8. SpringCloud的服务消费者 (一):(rest+ribbon)访问注册的微服务
  9. 一句话HTML编辑器
  10. CoopyIII开发文档之控制LED灯开关
  11. django加密解密api
  12. Windows10常用快捷键
  13. python基础(14)-反射&类的内置函数
  14. python版 mapreduce 矩阵相乘
  15. rsa加密解密, 非对称加密
  16. PHP Web项目开发学习,经验谈
  17. Android Studio 3.0 新特性
  18. UITabBarController 详解之 hidesBottomBarWhenPushed的正确用法
  19. Team Foundation Server (TFS)与Project Server集成,使用DNS(友好地址)地址注册PWA
  20. Luogu5110 块速递推

热门文章

  1. [unity3d程序] 纹理扩散
  2. ABBYY FineReader 12PDF选项卡有保存模式吗
  3. System.Threading.ThreadAbortException: 正在中止线程。
  4. 当用GridView导出Execl的时候,会发生只能在执行 Render() 的过程中调用 RegisterForEventValidation的错误
  5. Mozilla Brick:一个Web组件Polyfill库
  6. SQL集合运算参考及案例(二):树形节点数量逐级累计汇总
  7. 高性能MySQL --- 读书笔记(2) - 2016/8/2
  8. IntelliJ IDEA通过Spring配置连接MySQL数据库
  9. Windows2012 cannot access netapp CIFS share
  10. C#调用MySql