AutoResetEvent和ManualResetEvent区别

在.Net多线程编程中,AutoResetEvent和ManualResetEvent这两个类在多线程中经常用到
Set方法将信号置为发送状态,Reset方法将信号置为不发送状态,WaitOne等待信号的发送。

可以通过构造函数的参数值来决定其初始状态,若为true则非阻塞状态,为false为阻塞状态。

如果调用了WaitOne就进行阻塞,调用set就发送信号把让其继续往下走,

其区别就在调用后,AutoResetEvent.WaitOne()每次只允许一个线程进入,当某个线程得到信号后,AutoResetEvent会自动又将信号置为不发送状态,导致其他线程无法进行,进行阻塞

而ManualResetEvent则可以唤醒多个线程,因为当某个线程调用了ManualResetEvent.Set()方法后,其他调用WaitOne的线程获得信号得以继续执行,只有手动调用ReSet才会进行阻塞

//ManualResetEvent f = new ManualResetEvent(false);
        //如果是调用ManualResetEvent则末日为阻塞状态,点击button1则可以进去弹出对话框,循环一直弹出,
        //除非调用button2,让其不发送信号 则进行阻塞

        AutoResetEvent f = new AutoResetEvent(false);   
        //如过是调用AutoResetEvent末日开始为阻塞状态 点击button1则可以进入弹出对话框 text
        //但只弹出进行一次,如要再弹出则需要再次点击button1
        private void Form1_Load(object sender, EventArgs e)
        {
       
            Thread d = new Thread(() => {
                while (true) {
                    f.WaitOne();
            

                    MessageBox.Show("Test");
                }
            
            });
            d.Start();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            f.Set();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            f.Reset();
        }

 

posted @ 2017-11-01 09:43  余旺旺  阅读(312)  评论(0编辑  收藏  举报