热点推荐

查看: 720|回复: 1
收起左侧

[资料] ManualResetEvent和AutoResetEvent的区别

[复制链接]
  • TA的每日心情
    振奋
    7 天前
  • 签到天数: 535 天

    连续签到: 1 天

    [LV.9]以坛为家II

    347

    主题

    1289

    帖子

    6126

    积分

    Rank: 9

    积分
    6126

    突出贡献优秀版主荣誉管理论坛元老优质会员最佳新人

    发表于 2017-10-25 21:36:16 | 显示全部楼层 |阅读模式

    51Halcon诚邀您的加入,专注于机器视觉开发与应用技术,我们一直都在努力!

    您需要 登录 才可以下载或查看,没有帐号?会员注册

    x
    在讨论这个问题之前,我们先了解这样一种观点,线程之间的通信是通过发信号来进行沟通的。(这不是废话)
          先来讨论ManualResetEvent,讨论过程中我会穿插一些AutoResetEvent的内容,来做对比:
          ManualResetEvent都可以阻塞一个或多个线程,直到收到一个信号告诉ManualResetEvent不要再阻塞当前的线程。
    可以想象ManualResetEvent这个对象内部有一个Boolean类型的属性IsRelease来控制是否要阻塞当前线程。这个属性我们在初始化的时候可以设置它,如ManualResetEvent event=new ManualResetEvent(false);这就表明默认的属性是要阻塞当前线程。
          代码举例:
    1. ManualResetEvent _manualResetEvent = new ManualResetEvent(false);
    2.         private void BT_Temp_Click(object sender, RoutedEventArgs e)
    3.         {
    4.             Thread t1 = new Thread(this.Thread1Foo);
    5.             t1.Start(); //启动线程1
    6.             Thread t2 = new Thread(this.Thread2Foo);
    7.             t2.Start(); //启动线程2
    8.             Thread.Sleep(3000); //睡眠当前主线程,即调用BT_Temp_Click的线程
    9.             _manualResetEvent .Set();   //想象成将IsRelease设为True
    10.         }
    11.         void Thread1Foo()
    12.         {
    13.             _manualResetEvent .WaitOne();
    14. //阻塞线程1,直到主线程发信号给线程1,告知_menuResetEvent你的IsRelease属性已经为true,
    15. //这时不再阻塞线程1,程序继续往下跑
    16.             MessageBox.Show("t1 end");
    17.         }
    18.         void Thread2Foo()
    19.         {
    20.             _manualResetEvent .WaitOne();
    21. //阻塞线程2,直到主线程发信号给线程1,告知_menuResetEvent你的IsRelease属性已经为true,
    22. //这时不再阻塞线程2,程序继续往下跑
    23.             MessageBox.Show("t2 end");
    24.         }
    复制代码
           注意这里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.

    无效附件更新 权限提升操作 删帖申请 举报以及其他需要帮助请加入QQ群:214663141 广告位招商 有意者联系
    面向企业销售智能软件带相机和镜头,仅需3500,来电咨询 15019223858  18520862540
  • TA的每日心情
    害羞
    2018-9-4 14:47
  • 签到天数: 24 天

    连续签到: 2 天

    [LV.4]偶尔看看III

    0

    主题

    21

    帖子

    82

    积分

    Rank: 6Rank: 6

    积分
    82
    发表于 2018-8-2 20:13:14 | 显示全部楼层
    沙发,舒服

    发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题前面加上【已解决】

    回报帮助你解决问题的坛友,右下角【免费评分】赠与对方视觉币和热心值,伸手党遭人唾弃,做一个热心并受欢迎的人!

    您需要登录后才可以回帖 会员登录 | 会员注册

    本版积分规则

    经营性网站备案信息 经营性网站
    备案信息

    中国互联网举报中心 中国互联网
    举报中心

    中国文明网传播文明 中国文明网
    传播文明

    诚信网站

    深圳市市场监督管理局企业主体身份公示 工商网监
    电子标识