您现在的位置是:首页 >其他 >C# ManualResetEvent和AutoResetEvent的作用网站首页其他

C# ManualResetEvent和AutoResetEvent的作用

旧时量刑 2024-06-14 00:01:02
简介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进一个游客!

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。