线程同步,使用ManualResetEvent 和 AutoResetEvent
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("手动模式");
}
}

浙公网安备 33010602011771号