在 .Net 多线程中可以使用 ManualResetEvent 和 AutoResetEvent 来协调不同的线程的运行。文档中说这两个类都可以通过 set 方法释放信号,等待信号的线程可以通过捕获信号来控制线程的运行,和 ManualResetEvent 不同的是 AutoResetEvent 的 set 方法被调用以后,它会自动 reset。那么这个自动 reset 有什么用处呢?

简单的说 AutoResetEvent 的 set 和 reset 是一个原子操作,如果有多个线程等待 AutoResetEvent 的信号,那么只会有一个线程捕捉到信号。同样的情况下,ManualResetEvent 在没有 reset 之前所有的线程都可以捕捉到信号。

我们来看看下面的 c# 代码:

    public class AutoResetEventSample{private AutoResetEvent autoReset = new AutoResetEvent(false);public void RunAll(){new Thread(Worker1).Start();new Thread(Worker2).Start();new Thread(Worker3).Start();autoReset.Set();Thread.Sleep(1000);autoReset.Set();Console.WriteLine("主线程抵达最后一行。");}public void Worker1(){Console.WriteLine("进入线程 1");for (int i = 0; i < 5; i++){   autoReset.WaitOne();Console.WriteLine("线程 1 抓到信号");}}public void Worker2(){Console.WriteLine("进入线程 2");for (int i = 0; i < 5; i++){autoReset.WaitOne();Console.WriteLine("线程 2 抓到信号");}}public void Worker3(){Console.WriteLine("进入线程3");for (int i = 0; i < 5; i++){autoReset.WaitOne();Console.WriteLine("线程 3 抓到信号");}}}

我们会看到类似于下面的运行结果。每一次触发只会有一个线程捕捉到信号!


再看下面的代码,同样的多线程等待,我们使用 ManualResetEvent 来触发,因为没有 reset 所有线程都收到了信号。

    public class ManualResetEventSample{private ManualResetEvent manualReset = new ManualResetEvent(false);public void RunAll(){new Thread(Worker1).Start();new Thread(Worker2).Start();new Thread(Worker3).Start();Thread.Sleep(1000);manualReset.Set();Console.WriteLine("主线程抵达最后一行。");}public void Worker1(){Console.WriteLine("进入线程 1");//for (int i = 0; i < 5; i++){manualReset.WaitOne();Console.WriteLine("线程 1 抓到信号");}}public void Worker2(){Console.WriteLine("进入线程 2");//for (int i = 0; i < 5; i++){manualReset.WaitOne();Console.WriteLine("线程 2 抓到信号");}}public void Worker3(){Console.WriteLine("进入线程3");//for (int i = 0; i < 5; i++){manualReset.WaitOne();Console.WriteLine("线程 3 抓到信号");}}}

运行结果:

结论

ManualResetEvent 和 AutoResetEvent 的区别是,前者好比一扇普通的门,当一个人打开了以后,如果不主动的关上,那么后面的人都可以进入,而后者好比检票机的闸门是自动门,这种自动门每次打开进一个人以后就会被关上。

.Net 中 ManualResetEvent 和 AutoResetEvent 的区别相关推荐

  1. c#线程学习之ManualResetEvent和AutoResetEvent的区别!

    AutoResetEvent在.Net多线程编程中经常用到.当某个线程调用WaitOne方法后,信号处于发送状态,该线程会得到信号, 程序就会继续向下执行,否则就等待.而且 AutoResetEven ...

  2. C#笔记20:多线程之线程同步中的信号量AutoResetEvent和ManualResetEvent

    C#笔记20:多线程之线程同步中的信号量AutoResetEvent和ManualResetEvent 本章概要: 1:终止状态和非终止状态 2:AutoResetEvent和ManualResetE ...

  3. C#使用ManualResetEvent和AutoResetEvent处理线程通信

    示例 两个线程交替输出"1 a 2 b 3 c 4 d 5 ....." 代码 //利用ManualResetEvent和AutoResetEvent交替输出"1 a 2 ...

  4. C# 总结ManualResetEvent与AutoResetEvent【一】

    C# 总结ManualResetEvent与AutoResetEvent[一] ManualResetEvent: ManualResetEvent 允许线程通过发信号互相通信.通常,此通信涉及一个线 ...

  5. python中break和continue的区别

    python中break和continue的区别 break 结束for 或者while 循环  后面还没循环到的 不再循环 continue 当满足某种条件时结束当前值的循环 后面没有循环的继续循环 ...

  6. java中separator_java - File.separator和路径中的斜杠之间的区别

    java - File.separator和路径中的斜杠之间的区别 在Java Path-String中使用/和普通的File.separator有什么区别? 与双反斜杠相比,/平台独立似乎不是原因, ...

  7. PHP中self和static的区别,php中self与static的区别

    原文链接,猛击这里. php中self与static的区别 通过一些示例,我们可以很容易看出self和static的区别.假定我们有class Car – 它有两个方法,model和getModel. ...

  8. php 抽象类 接口 区别,PHP中抽象类、接口的区别与选择分析

    本文实例分析了PHP中抽象类.接口的区别与选择.分享给大家供大家参考,具体如下: 区别: 1.对接口的使用是通过关键字implements.对抽象类的使用是通过关键字extends.当然接口也可以通过 ...

  9. php $this self,php中self与$this的区别

    学习php中self与$this的区别. 先来看下parent与self的例子: /* * parent与self的区别 * by www.jbxue.com */ class A{ function ...

最新文章

  1. 用Python不回头也能看美女,这招你会了吗?
  2. 网络监听listen技术是什么原理?
  3. 简单绘图软件实现mfc大作业_生产流程图怎么做?简单易上手的流程图工具
  4. 自己做网站,论坛类型的
  5. mysql使用游标删除数据库_mysql 使用游标进行删除操作的存储过程
  6. Java(4)---Java 对象和类
  7. 离线在远程linux服务器配置vscode-python环境以及在容器中配置
  8. 【22年新版】软件工程专业的各阶段的学习方法
  9. 电脑使用变慢七大原因全解析
  10. 终端服务器安全层在协议流中检测到错误,智能卡远程登录AD域环境下win7/2008,返回STATUS_LOGON_TYPE_NOT_GRANTED错误...
  11. 运营100天的微信公众号能挣多少钱?
  12. 【评测】Tecan品牌系列产品
  13. 正则表达式--教程二(语法)
  14. 图像处理----形态学滤波
  15. 使用Stream操作List
  16. js html页面原生js横向打印
  17. Linux常见权限处理、文件搜索、帮助、压缩命令
  18. 三国志战略版:Daniel_颜良分析
  19. mvn 命令打包项目
  20. subsonic配置

热门文章

  1. jsp页面兼容谷歌浏览器相关问题
  2. 解释一下python numpy 中的amin()函数
  3. 标准化管理-(3)科研项目中的标准化审查
  4. java三大特征之封装,继承,多态浅析
  5. 利用html设置嵌套式表格,表格嵌套 HTML
  6. 微信公众号爬虫的基本原理
  7. 数据标注丨7大数据标注工具分享
  8. python远程连接timesten
  9. Java算法分析与设计视频教程
  10. location.hash 原生js页面跳转/路由