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(); }