c# AutoResetEvent和ManualResetEvent

网上有不少AutoResetEvent和ManualResetEvent的详细介绍,在这里不作过多详细的解释,写下本身的一点心得留做备忘。多线程

AutoResetEvent和ManualResetEvent都是事件锁,事件的功能就是能够在被监控者发生某种变化后当即通知监控者并作出相应反应。函数

在使用多线程过程当中,锁几乎是不可缺乏的一项,咱们拿信号量和事件锁举例来讲。spa

若是有一个厨师和一群顾客,若是是使用信号量的话,状况以下:顾客询问厨师:“饭作好了吗?”,厨师:“尚未好,等一会吧!”,顾客继续等待一段时间后继续询问,循环往复,直到饭作好后开始吃饭。线程

若是采用事件锁的话,状况以下:厨师告诉顾客:“你先等一会吧,饭作好后,我告诉你!”,顾客等待,厨师告诉顾客:“饭作好了,你过来吃吧!”,顾客吃饭。在这种模式下,使用事件锁就会好一些。code

AutoResetEvent myAutoRetEvent = new AutoResetEvent(false);blog

ManualResetEvent myManualRetEvent = new ManualResetEvent(false);事件

//通知正在等待的线程已发生事件(厨师)it

//构造函数函数变量若是为:false,初始状态非终止状态。厨师的初始状态就很忙碌,顾客若是要吃饭就要等待。class

//构造函数变量若是为:true,初始状态为终止状态。厨师的初始状态为已经作好了饭,顾客能够直接吃饭。监控

 

/// <summary>
        /// 通知正在等待的线程已发生事件 true:初始状态为终止状态 false:初始状态为非终止状态
        /// 目前的初始状态未厨师没有作饭
        /// </summary>
        private AutoResetEvent myAutoRetEvent = new AutoResetEvent(false);

        private void button2_Click(object sender, EventArgs e)
        {
            Thread myThread = new Thread(new ThreadStart(RunStart));
            myThread.Start();
            //厨师作饭作了3000ms
            Thread.Sleep(3000);
            //厨师告诉顾客饭作好了
            myAutoRetEvent.Set();
        }

        private void RunStart()
        {
            //顾客来了,要吃饭
            myAutoRetEvent.WaitOne();
            MessageBox.Show("吃饭...");
        }


单击按钮后,等待3秒后,弹出“吃饭...”,若是把构造函数中的false改成true,单击按钮后,当即弹出“吃饭...”。

而ManualResetEvent与AutoResetEvent的区别是:前者(厨师作好饭后,全部的顾客都开始吃饭),然后者(厨师作好饭后,只有一个顾客能吃到饭。)

 

AutoResetEvent:

/// <summary>
        /// 通知正在等待的线程已发生事件 true:初始状态为终止状态 false:初始状态为非终止状态
        /// 目前的初始状态未厨师没有作饭
        /// </summary>
        private AutoResetEvent myAutoRetEvent = new AutoResetEvent(false);

        private void button3_Click(object sender, EventArgs e)
        {
            //来了一个顾客1
            Thread myThread1 = new Thread(new ThreadStart(Run_1));
            myThread1.Start();
            //来了一个顾客2
            Thread myThread2 = new Thread(new ThreadStart(Run_2));
            myThread2.Start();

            //厨师作饭作3000ms
            Thread.Sleep(3000);
            //厨师作好饭了,通知看谁能吃上饭
            myAutoRetEvent.Set();
        }

        private void Run_1()
        {
            //顾客1过来了,要吃饭,等厨师作好饭
            myAutoRetEvent.WaitOne();
            MessageBox.Show("我是顾客1开始吃饭...");
        }

        private void Run_2()
        {
            //顾客2过来了,要吃饭,等厨师作好饭
            myAutoRetEvent.WaitOne();
            MessageBox.Show("我是顾客2开始吃饭...");
        }

ManualResetEvent:

private ManualResetEvent myManualRetEvent = new ManualResetEvent(false);

        private void button4_Click(object sender, EventArgs e)
        {
            //来了一个顾客1
            Thread myThread3 = new Thread(new ThreadStart(Run_3));
            myThread3.Start();
            //来了一个顾客2
            Thread myThread4 = new Thread(new ThreadStart(Run_4));
            myThread4.Start();

            //厨师作饭作3000ms
            Thread.Sleep(3000);
            //厨师作好饭了,通知看谁能吃上饭
            myManualRetEvent.Set();
        }

        private void Run_3()
        {
            //顾客1过来了,要吃饭,等厨师作好饭
            myManualRetEvent.WaitOne();
            MessageBox.Show("我是顾客1开始吃饭...");
        }

        private void Run_4()
        {
            //顾客2过来了,要吃饭,等厨师作好饭
            myManualRetEvent.WaitOne();
            MessageBox.Show("我是顾客2开始吃饭...");
        }

厨师作好饭后,通知你们,全部等待的顾客都开始吃饭。二者的区别如上所述。

此篇文章是受csdn 陆敏技的文章启发,便于本身的理解记忆。

相关文章
相关标签/搜索