C# ManualResetEvent和AutoResetEvent的作用

ManualResetEvent和AutoResetEvent的作用

是用来控制线程暂停或者继续的,常用的方法有WaitOne,set,Reset.

这三个函数的含义:

去旅游景点排队检票

waitone:等下个过来检票

set:身份核验通过,你买的是今天的票,开启闸门

reset:关闭闸门

 AutoResetEvent autoWaitsupport = new AutoResetEvent(false);//闸门默认关闭

 AutoResetEvent autoWaitsupport = new AutoResetEvent(true);//闸门默认开启

ManualResetEvent manueWaitsupport = new ManualResetEvent(false);//闸门默认关闭

ManualResetEvent manueWaitsupport = new ManualResetEvent(false);//闸门默认开启

ManualResetEvent和AutoResetEvent的区别

AutoResetEvent:是自动的,每次通过后,自动关闭,即上一个游客通过后,闸门自动关闭,下一个游客需要再检票通过,

ManualResetEvent:是手动的,每次通过后,手动关闭,即上一个游客通过后,闸门没有手动关闭,这闸门一直开着,剩下的游客不需要检票也可通过

即:

AutoResetEvent   收到 Set 后 , 一次只能执行一个线程,其它线程继续 WaitOne .
 ManualResetEvent  收到 Set 后,所有处理 WaitOne 状态线程均继续执行.

ManualResetEvent更加自由、开放。如果把AutoResetEvent看作是只能单人通过的独木桥的话,那么ManualResetEvent就像一座城门,一下子可以涌入千军万马,当然你也可以随时关闭城门,让后面的人进不来。

如果共享资源仅允许一个线程单独使用的情况下,可以选择AutoResetEvent;如果共享资源允许多个线程同时使用,则可以选择ManualResetEvent

如果要控制多个线程暂停、继续,可以选择ManualResetEvent

测试代码如下:

     public class StudyResetEvent
    {
        public AutoResetEvent mreWaitsupport = new AutoResetEvent(true);//阀门开启
        public void Car1()
        {
            mreWaitsupport.WaitOne();//因车闸默认开启,WaitOne毫无意义
            Console.WriteLine("噫!通道1进一个游客!"); 
            
        }

        public void Car2()
        {
            mreWaitsupport.WaitOne();//因车闸默认开启,WaitOne毫无意义
            Console.WriteLine("噫!通道2进一个游客!");
        }
    }


StudyResetEvent a=new StudyResetEvent();
new Thread(a.Car1).Start();
new Thread(a.Car2).Start();
a.mreWaitsupport.Set();//开启车闸

Console.ReadKey();

输出结果:噫!通道1进一个游客!

想要输出两个结果的话:

   public class StudyResetEvent
    {
        public AutoResetEvent mreWaitsupport = new AutoResetEvent(true);//阀门开启
        public void Car1()
        {
            mreWaitsupport.WaitOne();//因车闸默认开启,WaitOne毫无意义
            Console.WriteLine("噫!通道1进一个游客!"); 
            mreWaitsupport.set();
        }

        public void Car2()
        {
            mreWaitsupport.WaitOne();//因车闸默认开启,WaitOne毫无意义
            Console.WriteLine("噫!通道2进一个游客!");
        }
    }

输出结果:

噫!通道1进一个游客!

噫!通道2进一个游客!

也就是每调用一次Set,仅有一个线程会继续。换言之,有多少个线程就要调用多少次Set,线程才会全部继续。

这也表明,AutoResetEvent是典型的队列操作形式。

 public class StudyResetEvent
    {
        public ManualResetEvent mreWaitsupport = new ManualResetEvent(true);//阀门开启
        public void Car1()
        {
            mreWaitsupport.WaitOne();//因车闸默认开启,WaitOne毫无意义
            Console.WriteLine("噫!通道1进一个游客!");
            
        }

        public void Car2()
        {
            mreWaitsupport.WaitOne();//因车闸默认开启,WaitOne毫无意义
            Console.WriteLine("噫!通道2进一个游客!");
        }
    }

StudyResetEvent a=new StudyResetEvent();
new Thread(a.Car1).Start();
new Thread(a.Car2).Start();
a.mreWaitsupport.Set();//开启车闸

Console.ReadKey();

输出结果:

噫!通道1进一个游客!

噫!通道2进一个游客!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值