线程同步,使用ManualResetEvent 和 AutoResetEvent

ManualResetEvent
Set()方法将状态设置为有信号
Reset()将其设置为无信号
WaitOne()将阻塞到其有信号为止, 若调用WaitOne的时刻就是有信号的,将不会阻塞

AutoResetEvent
与ManualResetEvent的区别是,AutoResetEvent.WaitOne()会自动改变事件对象的状态,即AutoResetEvent.WaitOne()每执行一次,事件的状态就改变一次。有信号-->无信号;无信号-->有信号

实例如下:

 

//**********************************//
        //测试自动模式
        //**********************************//
        AutoResetEvent _autoResetEvent = new AutoResetEvent(true);//为true时,表示终止状态,这种情况下,waitOne是不起作用的
                                                                                                   //true表示有信号状态,在有信号状态,waitOne不起作用
        private void button1_Click(object sender, EventArgs e)
        {
            Thread t1 = new Thread(this.Thread1Foo);
            t1.Start();
            Thread.Sleep(3000);
            while (true)
            {
                _autoResetEvent.Set();                             //set可以设置为有信号状态,如果有信号,waitOne不起作用的
            }
        }

        void Thread1Foo()
        {
            while (true)
            {
                _autoResetEvent.WaitOne();                       //自动模式下,WaitOne之后,会改变信号灯状态
                MessageBox.Show("自动模式");                     //每执行一次,事件的状态就改变一次。有信号-->无信号;无信号-->有信号
            }
        }

      自动模式下,WaitOne之后,会改变信号灯状态

 

        //**********************************//
        //测试手动模式
        //**********************************//
        ManualResetEvent _manualResetEvent = new ManualResetEvent(true);// true时,表示有信号,此事waitOne不起作用
                                                                        //


        private void button2_Click(object sender, EventArgs e)
        {
            Thread t1 = new Thread(this.Thread2Foo);
            t1.Start();
            Thread.Sleep(3000);
            _manualResetEvent.Set();                             //set可以设置为有信号状态,如果有信号,waitOne不起作用的
            _manualResetEvent.Reset();
        }

        void Thread2Foo()
        {
            while (true)
            {
                Thread.Sleep(1000);
                _manualResetEvent.WaitOne();                       //手动模式下,WaitOne之后,不会改变信号灯状态
                MessageBox.Show("手动模式");
            }
        }

 

你可能感兴趣的:(event)