ManualResetEvent 与 AutoResetEvent

1. ManualResetEvnet

   var mevent = new ManualResetEvent(false);
            Task.Factory.StartNew(() =>
                {
                    mevent.WaitOne();                                                          
                    MessageBox.Show("Task1");
                });
            Task.Factory.StartNew(() =>
            {          
                mevent.WaitOne();                    
                MessageBox.Show("Task2");
            });
            Thread.Sleep(2000);
            mevent.Set();


在初始化时已经设置为 false , 此时WaitOne是等不到结果的。

之后 mevent.Set() 把状态设置为true , 此时WaitOne就可以执行完毕。

此时状态一直是true, 只有Reset才变为false。

注意,当 ManualResetEvent Set()后,会使得所有等待的 WaitOne 执行完毕。

上面的代码 Task1 和 Task2 都将继续执行下去


2.AutoResetEvent

他不但可以自动Reset, 而且,当他Set后,自动立刻再次变为 false 状态。

很多地方没有好好说明 什么叫 “立刻” 。我们稍后解释。

   var aevent = new AutoResetEvent(false);
            Task.Factory.StartNew(() =>
                {
                    aevent.WaitOne();                                                          
                    MessageBox.Show("Task1");
                });
            Task.Factory.StartNew(() =>
            {
                aevent.WaitOne();                    
                MessageBox.Show("Task2");
            });
            Thread.Sleep(2000);
            aevent.Set();
上面的代码, 当 aevent.Set() 后 只能 使一个WaitOne完成

一般是 Task1


3. 解释一下 “立刻” 的含义

为什么 ManualResetEvent 可以释放所有的 WaitOne , 而AutoResetEvent 只能释放一个?

我们可以通过以下代码,让 ManualResetEvent也只释放一个 WaitOne , 类似AutoResetEvent

 var mevent = new ManualResetEvent(false);
            Task.Factory.StartNew(() =>
                {
                    lock (mevent)
                    {
                        mevent.WaitOne();
                        mevent.Reset();
                    }
                                                                          
                    MessageBox.Show("Task1");
                });
            Task.Factory.StartNew(() =>
            {
                lock (mevent)
                {
                    mevent.WaitOne();
                    mevent.Reset();
                }                 
                MessageBox.Show("Task2");
            });
            Thread.Sleep(2000);
            mevent.Set();
        }

上面的代码通过 lock 使得 mevent立刻Reset 达到了 AutoResetEvent 的效果

从这里也可以看到 “立刻” 的含义其实是 在释放完一个 WaitOne(或者没有任何可以释放的对象)后,立刻Reset

转载于:https://www.cnblogs.com/norsd/archive/2013/04/17/6359419.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值