AutoResetEvent/ManualResetEvent 都是继承自 EventWaitHandle ,EventWaitHandle继承自WaitHandle.

在讨论这个问题之前,我们先了解这样一种观点,线程之间的通信是通过发信号来进行沟通的。(这不是废话)

先来讨论ManualResetEvent,讨论过程中我会穿插一些AutoResetEvent的内容,来做对比:

ManualResetEvent都可以阻塞一个或多个线程,直到收到一个信号告诉ManualResetEvent不要再阻塞当前的线程。

可以想象ManualResetEvent这个对象内部有一个Boolean类型的属性IsRelease来控制是否要阻塞当前线程。这个属性我们在初始化的时候可以设置它,如ManualResetEvent event=new ManualResetEvent(false);这就表明默认的属性是要阻塞当前线程。

代码举例:

ManualResetEvent _manualResetEvent = new ManualResetEvent(false);

private void BT_Temp_Click(object sender, RoutedEventArgs e) 
        { 
            Thread t1 = new Thread(this.Thread1Foo); 
            t1.Start(); //启动线程1
            Thread t2 = new Thread(this.Thread2Foo); 
            t2.Start(); //启动线程2
            Thread.Sleep(3000); //睡眠当前主线程,即调用BT_Temp_Click的线程
            _manualResetEvent .Set();   //想象成将IsRelease设为True 
        }

void Thread1Foo() 
        { 
            _manualResetEvent .WaitOne();

//阻塞线程1,直到主线程发信号给线程1,告知_menuResetEvent你的IsRelease属性已经为true,

//这时不再阻塞线程1,程序继续往下跑

MessageBox.Show("t1 end"); 
        }

void Thread2Foo() 
        { 
            _manualResetEvent .WaitOne();

//阻塞线程2,直到主线程发信号给线程1,告知_menuResetEvent你的IsRelease属性已经为true,

//这时不再阻塞线程2,程序继续往下跑

MessageBox.Show("t2 end"); 
        }

注意这里ManualResetEvent和AutoResetEvent的一个重要区别:

  1.manual的话肯定会给线程1和线程2都发送一个信号,而auto只会随机给其中一个发送信号,也就是只有一方可以继续行动。

为什么一个叫manual而一个叫auto呢?我想这是很多人的疑问,现在我们就来看这个问题。

2.刚才_manualResetEvent .Set();的这句话我想大家都明白了,可以看做将IsRelease的属性设置为true.线程1中

 _manualResetEvent.WaitOne();接收到信号后不再阻塞线程1。在此之后的整个过程中IsRelease的值都是true.如果

想将IsRelease的值回复成false,就必须再调用_manualResetEvent.Reset()的方法。

  

转载于:https://www.cnblogs.com/x-poior/p/6305652.html

【深度好文】多线程之WaitHandle--派生EventWaitHandle事件构造-》AutoResetEvent、ManualResetEvent...相关推荐

  1. (十)java多线程之CountDownLatch

    目录 引言 理论 例子 打赏 本人邮箱: kco1989@qq.com 欢迎转载,转载请注明网址 http://blog.csdn.net/tianshi_kco github: https://gi ...

  2. 深度好文:云网络丢包故障定位,看这一篇就够了~

    深度好文:云网络丢包故障定位,看这一篇就够了~ https://mp.weixin.qq.com/s/-Q1AkxUr9xzGKwUMV-FQhQ Alex 高效运维 今天 来源:本文经授权转自公众号 ...

  3. 稳扎稳打Silverlight(25) - 2.0线程之Thread, Timer, BackgroundWorker, ThreadPool

    [索引页] [源码下载] 稳扎稳打Silverlight(25) - 2.0线程之Thread, Timer, BackgroundWorker, ThreadPool 作者:webabcd 介绍 S ...

  4. 多线程之CompletableFuture全方面解析

    多线程之CompletableFuture全方面解析 目录: 前言: ​ 在我们写的一个底层Api中,由于上亿级数据量情况下,查询效率较慢,本篇文档记录一下优化过程所用技术栈CompletableFu ...

  5. Android多线程之ArrayBlockingQueue源码解析

    阻塞队列系列 Android多线程之LinkedBlockingQueue源码解析 Android多线程之SynchronousQueue源码解析 Andorid多线程之DelayQueue源码分析 ...

  6. Asp.Net Core 轻松学-多线程之Task快速上手

    Asp.Net Core 轻松学-多线程之Task快速上手 原文:Asp.Net Core 轻松学-多线程之Task快速上手 前言     Task是从 .NET Framework 4 开始引入的一 ...

  7. 百度工程师深度好文, 横评3大企业级区块链技术平台

    百度工程师深度好文, 横评3大企业级区块链技术平台! 区块链从独立的技术范式,慢慢扩展到企业区块链的融合范式,是下一代区块链的核心特征.在区块链技术与AI.大数据.云计算技术加速融合的今天,区块链如何 ...

  8. JAVA多线程之wait/notify

    本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...

  9. linux 线程pthread_detach,linux线程之pthread_join和pthread_detach

    在任何一个时间点上,线程是可结合的(joinable)或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源和杀死.在 被其他线程回收之前,它的存储器资源(例如栈)是不释放的.相反 ...

最新文章

  1. Linux命令行好玩的命令
  2. 友盟小米收不到推送消息_Android 手机收不到消息推送的设置指南 - 融云 RongCloud...
  3. 利用XML生成Excel
  4. redis数据结构类型
  5. 解决asp.net 3.5sp1错误
  6. Filecoin网络目前总质押量约为3314万枚FIL
  7. magento模板制作教程(一)
  8. poj 3735 Training little cats (矩阵快速幂)
  9. 编译OpenJDK:make[1]: *** 没有规则可制作目标“openjdk8/jdk/src/share/classes/java/applet/AppletContext.java”,
  10. c++字节对齐编译器指令#pragma
  11. 3A算法—自动对焦(AF)
  12. IOS 苹果公司开发者账号注册申请流程
  13. JAVA学习DAY3 - 循环 输出平行四边形,等腰三角形,菱形
  14. linux lilo密码,LILO Security
  15. 电脑重装系统不小心格式化了恢复文件教程
  16. slim 搭建rnn_RNN入门(三)利用LSTM生成旅游点评
  17. win10触摸板双指单击不能唤出右键菜单
  18. Java正则表达式的使用
  19. 树莓派自定义游戏,Minecraft硬件编程,建造房屋,我的世界还可以这样玩
  20. 计算机网络复习笔记 之协议相关

热门文章

  1. P2572 [SCOI2010]序列操作
  2. yum安装MariaDb10.2国内yum源配置
  3. caffe的python接口学习(8):caffemodel中的参数及特征的抽取
  4. GitHub上排名前100的iOS开源库介绍(来自github)
  5. 应该怎么做一个登录功能?
  6. ThinikPHP 前端URL模式
  7. Nginx+SSL+Tomcat+CDN部署总结,已实践有效~
  8. 3409: [Usaco2009 Oct]Barn Echoes 牛棚回声
  9. uva 10608 FRIENDS
  10. OkHttp使用介绍 和 使用进阶