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 阻止线程,直到所有指示的事件都变为终止状态。

最新文章

  1. C++:通过gethostbyname函数,根据服务器的域名,获取服务器IP
  2. HiHo Coder字典树 TrieTree
  3. java 字节数组转int
  4. 控件构造函数需要的AOwner是TComponent,而不是Parent
  5. Axure 原型设计工具画业务流程图
  6. D5
  7. Oracle DB Day01(SQL)
  8. [Swift]LeetCode437. 路径总和 III | Path Sum III
  9. node 单个表加条件查询
  10. HDU 1077
  11. angularjs 的ng-disabled属性操作
  12. 【mysql】批量更新数据
  13. AI for VS ,美团创新之处分析
  14. (6)进程---Event事件
  15. js中的eval函数另一种实现
  16. 使用WebStorm自动提示nodejs的有关代码
  17. Slickflow.NET 开源工作流引擎高级开发(三) -- 并行分支容器与会签工作流模式的组合
  18. The future of scripting in Unity
  19. C# MD5一句话加密
  20. C# Winform 跨线程更新UI控件常用方法汇总

热门文章

  1. Atitit.jsou html转换纯文本 java c# php
  2. Sharepoint 2013 开启App和配置App
  3. 【读书笔记】iOS-GCD-block-后台运行
  4. 基础学习day08---多态、简单工厂、Object类equals和toString
  5. iOS屏幕适配知识
  6. Silverlight项目笔记8:层次布局、客户端读取shp、ExecuteCountAsync、柱状图、url传参
  7. Linux 基础知识----shell
  8. 转 Android Dalvik虚拟机初识
  9. Monyer.cn黑客小游戏
  10. 学习HTML5必读之《HTML5设计原理》