【C#】【Thread】ManualResetEvent和AutoResetEvent区别
ManualResetEvent和AutoResetEvent主要用于线程之间同步问题。
主要使用方法有Set();Reset();WaitOne();
Set():将事件状态设置为终止状态,允许一个或多个等待线程继续。也就是说是结束状态,这个时候可以运行。
Reset():将事件状态设置为非终止状态,导致线程阻止。也就是说是在运行状态,这个时候WaitOne()位置会等待,阻塞。
WaitOne():阻止当前线程,直到当前 System.Threading.WaitHandle 收到信号。就是当前线程会等在WaitOne这个位置直到某个位置调用了Set()。
ManualResetEvent manualEvent = new ManualResetEvent(false);
AutoResetEvent autoEvent = new AutoResetEvent(false);
两个构造函数都有一个bool值参数:
true表示终止状态,即类似内部帮你调用了Set();
false表示非终止状态,即类似内部帮你调用了Reset();
以上为共同点,接下去说一下不同点。
经过网上查阅资料,以及自己测试的结果,本人认为主要区别在于WaitOne();方法上。
manualEvent.WaitOne();不会做处理,只是阻塞线程作用。
autoEvent.WaitOne();会重新把autoEvent设置为非终止状态,也就是说内部可能会调用Reset();
所以呢区别就是:
manualEvent.Set();解放线程之后,所有的WaitOne都不会再阻塞。需要手动Reset();才能再次阻塞。
autoEvent.Set();解放线程之后,第一个WaitOne执行下去,第二个WaitOne开始又会阻塞,需要再次Set();解放阻塞。
换言之:ManualResetEvent 需要手动Reset进行阻塞线程,AutoResetEvent 每次WaitOne后自动Reset阻塞线程,无需人为操作。
PS.WaitHandle的使用
System.Threading.WaitHandle.WaitOne 使线程一直等待,直到单个事件变为终止状态;
System.Threading.WaitHandle.WaitAny 阻止线程,直到一个或多个指示的事件变为终止状态;
System.Threading.WaitHandle.WaitAll 阻止线程,直到所有指示的事件都变为终止状态。
最新文章
- C++:通过gethostbyname函数,根据服务器的域名,获取服务器IP
- HiHo Coder字典树 TrieTree
- java 字节数组转int
- 控件构造函数需要的AOwner是TComponent,而不是Parent
- Axure 原型设计工具画业务流程图
- D5
- Oracle DB Day01(SQL)
- [Swift]LeetCode437. 路径总和 III | Path Sum III
- node 单个表加条件查询
- HDU 1077
- angularjs 的ng-disabled属性操作
- 【mysql】批量更新数据
- AI for VS ,美团创新之处分析
- (6)进程---Event事件
- js中的eval函数另一种实现
- 使用WebStorm自动提示nodejs的有关代码
- Slickflow.NET 开源工作流引擎高级开发(三) -- 并行分支容器与会签工作流模式的组合
- The future of scripting in Unity
- C# MD5一句话加密
- C# Winform 跨线程更新UI控件常用方法汇总
热门文章
- Atitit.jsou html转换纯文本 java c# php
- Sharepoint 2013 开启App和配置App
- 【读书笔记】iOS-GCD-block-后台运行
- 基础学习day08---多态、简单工厂、Object类equals和toString
- iOS屏幕适配知识
- Silverlight项目笔记8:层次布局、客户端读取shp、ExecuteCountAsync、柱状图、url传参
- Linux 基础知识----shell
- 转 Android Dalvik虚拟机初识
- Monyer.cn黑客小游戏
- 学习HTML5必读之《HTML5设计原理》