AutoResetEvent和ManualResetEvent理解 z
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
最新文章
- 关于Java中进程和线程的详解
- c# Winform 开发分屏显示应用程序
- [USACO2009 NOV GOLD]奶牛的图片
- mysql 如何设置自动增长序列 sequence(一)
- 12.Android之Tabhost组件学习
- import Tkinter的时候报错
- BZOJ 3207 花神的嘲讽计划Ⅰ(函数式线段树)
- SpringCloud的服务消费者 (一):(rest+ribbon)访问注册的微服务
- 一句话HTML编辑器
- CoopyIII开发文档之控制LED灯开关
- django加密解密api
- Windows10常用快捷键
- python基础(14)-反射&;类的内置函数
- python版 mapreduce 矩阵相乘
- rsa加密解密, 非对称加密
- PHP Web项目开发学习,经验谈
- Android Studio 3.0 新特性
- UITabBarController 详解之 hidesBottomBarWhenPushed的正确用法
- Team Foundation Server (TFS)与Project Server集成,使用DNS(友好地址)地址注册PWA
- Luogu5110 块速递推
热门文章
- [unity3d程序] 纹理扩散
- ABBYY FineReader 12PDF选项卡有保存模式吗
- System.Threading.ThreadAbortException: 正在中止线程。
- 当用GridView导出Execl的时候,会发生只能在执行 Render() 的过程中调用 RegisterForEventValidation的错误
- Mozilla Brick:一个Web组件Polyfill库
- SQL集合运算参考及案例(二):树形节点数量逐级累计汇总
- 高性能MySQL --- 读书笔记(2) - 2016/8/2
- IntelliJ IDEA通过Spring配置连接MySQL数据库
- Windows2012 cannot access netapp CIFS share
- C#调用MySql