首页 > 编程语言 >c#线程学习之ManualResetEvent和AutoResetEvent的区别!

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

时间:2022-11-17 18:25:23浏览次数:34  
标签:Thread c# ManualResetEvent 阻塞 IsRelease AutoResetEvent 线程 manualResetEvent

转自:https://www.cnblogs.com/jicheng/articles/5998244.html

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

 

      先来讨论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 ——。相对的 .reset()则设置成False;
        }

        void Thread1Foo()
        {
            _manualResetEvent .WaitOne(); 

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

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

            MessageBox.Show("t1 end");
        }

        void Thread2Foo()
        {
            _manualResetEvent .WaitOne();

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

    //这时不再阻塞线程2,程序继续往下跑。t2线程即同时知道

            MessageBox.Show("t2 end");
        }

 

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

       manual的话肯定会给线程1和线程2都发送一个信号,而auto只会随机给其中一个发送信号。

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

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

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

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

       如果是_autoResetEvent.set(),那么_autoResetEvent.WaitOne()后会自动将IsRelease的值自动设置为false。

  这就是为什么一个叫auto(自动),一个叫manual(手动)。

以上是鄙人的一些学习中的收获,以及部分粗鄙的见解,分享给刚好在这方面或有困惑的园友,同时也用作笔记!或有部分素材收集于网络,理解如有偏颇,请园友回复指正!拜谢!___ 勤能补拙是良训,一分辛苦一分才。与诸君共勉!

标签:Thread,c#,ManualResetEvent,阻塞,IsRelease,AutoResetEvent,线程,manualResetEvent
From: https://www.cnblogs.com/Jamesblog/p/16900356.html

相关文章

  • Lightroom Classic for mac(Lrc2021) 10.3中文直装版
    Lightroom Classic2021中文版为照片展现出摄影效果最佳一面所需的所有桌面编辑工具,包括提亮颜色、使灰暗的摄影更加生动、删除瑕疵、将弯曲的画面拉直等。您可以在电脑桌......
  • Tomcat的概述、部署、及优化
    一、Tomcat概述1、Tomcat的概念Tomcat是Java语言开发的,服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下......
  • 定制Centos8的图形用户界面之定制图形元素
    解压install.img之后。挂载squashfs-root/LiveOS/rootfs.img到一个空文件夹安装程序的可自定义图形元素存储在安装程序运行时文件系统的 /usr/share/anaconda/pixmaps/ ......
  • node __dirname is not defined in ES module scope in JS
    在es模块中使用__dirname时,会报错The"__dirnameisnotdefinedinESmodulescope"erroroccurswhenwetrytotrytousethe__dirnameglobalvariableinanES......
  • focus blur 事件
    前言在浏览器中表单元素天然支持focus和blur事件,这两个事件在开发过程中出现的频率还是挺高的,前端开发者也都比较熟悉,在这里特意总结一下。触发场景鼠标点击键盘ta......
  • Tomcat多实例部署
    一、实例操作:Tomcat多实例1、关闭防火墙,将安装Tomcat所需软件包传到/opt目录下2、安装JDK3、安装tomcat4、配置tomcat环境变量5、修改tomcat2中的se......
  • CAN总线数据链路层(一)
    1.通信机制发送报文。1.首先检测Bus状态,空闲则发送报文且回读        2.线与机制,若有两个节点同时发报文         报文结构:         ......
  • 【c&c++】对象的创建与引用计数器实现
    在面向对象的编程语言中,很多语言会根据引用计数器来实现对对象的自动回收机制,就和Unix/Linux中的文件系统那样,当一个对象被另一个对象持有时,被持有的对象自身的引用计数器......
  • VS Code编辑器调试Java总结
    1背景最近在从Go程序员切换成Java程序员,在前期需要解决的一个重要问题就是在VSCode编辑器中如何进行Java代码的调试。调试,是程序员的必备基础日常技能。参加工作以来,......
  • IOC容器的加载过程-Bean的生命周期
    核心模块部分截图:   IOC源码加载过程:1.newAnnotationConfigApplicationContext():         再看:AnnotationConfigApplicationContext()的无......