AutoResetEvent和ManualResetEvent的区别

 摘抄函数

一、AutoResetEvent和ManualResetEvent的区别this

  终止状态和非终止状态:
  AutoResetEvent和ManualResetEvent的构造函数中,都有bool变量来指明线程的终止状态和非终止状态。

true: 表示终止状态(我的理解也就是可运行状态,根据理解应该是该线程的阻塞终止了)
false:表示非终止状态(不可运行状态,线程的阻塞开始了)线程

AutoResetEvent _autoResetEvent = new AutoResetEvent(false);

private void BT_Temp_Click(object sender, RoutedEventArgs e)
{
Thread t1 = new Thread(this.Thread1Foo);
t1.Start();
Thread.Sleep(3000); //Thread.Sleep(Int32)是批当前进程挂起3000毫秒,与线程t1是一点关系也没有的。
_autoResetEvent.Set();
}进程

void Thread1Foo()
{
_autoResetEvent.WaitOne();
MessageBox.Show("t1 end");
}

这段代码的执行结果,就是3秒钟事后,弹出“t1 end”。

而若是把:
AutoResetEvent _autoResetEvent = new AutoResetEvent(false);//非终止状态

改成:
AutoResetEvent _autoResetEvent = new AutoResetEvent(true);//终止状态(阻塞终止)

则“t1 end”将会马上弹出。
也就是说,在终止状态中,_autoResetEvent.WaitOne()是不会起到阻滞工做线程的做用的。
(PS:ManualResetEvent也一样)资源

AutoResetEvent和ManualResetEvent的区别:
AutoResetEvent 容许线程经过发信号互相通讯。 一般,当线程须要独占访问资源时使用该类。同步

线程经过调用 AutoResetEvent 上的 WaitOne 来等待信号。
若是 AutoResetEvent 为非终止状态,则线程会被阻止,并等待当前控制资源的线程经过调用 Set来通知资源可用。it

调用 Set 向 AutoResetEvent 发信号以释放等待线程。
AutoResetEvent 将保持终止状态,直到一个正在等待的线程被释放,而后自动返回非终止状态。 若是没有任何线程在等待,则状态将无限期地保持为终止状态。
若是当 AutoResetEvent 为终止状态时线程调用 WaitOne,则线程不会被阻止。
AutoResetEvent 将当即释放线程并返回到非终止状态。class

AutoResetEvent只会给一个线程发送信号,而不会给多个线程发送信号。
须要同步多个线程的时候,就只能采用ManualResetEvent了。至于深层次的缘由是,AutoResetEvent在set()以后,会将线程 状态自动置为false,而ManualResetEvent在Set()后,线程的状态就变为true了,必须手动ReSet()以后,才会从新将线程置为false。这也就是为何他们的名字一个为Auto,一个为Manual的缘由。

ManualResetEvent _menuRestEvent = new ManualResetEvent(false);

private void BT_Temp_Click(object sender, RoutedEventArgs e)
{
Thread t1 = new Thread(this.Thread1Foo);
t1.Start();
Thread t2 = new Thread(this.Thread2Foo);
t2.Start();
Thread.Sleep(3000);
_menuRestEvent.Set();
//_menuRestEvent.Reset();
}变量

void Thread1Foo()
{
_menuRestEvent.WaitOne();
MessageBox.Show("t1 step1 end");

//睡1S,用于等待主线程_menuRestEvent.Reset();
Thread.Sleep(1000);
_menuRestEvent.WaitOne();
MessageBox.Show("t1 step2 end");
}object

void Thread2Foo()
{
_menuRestEvent.WaitOne();
MessageBox.Show("t2 step1 end");
//睡1S,用于等待主线程_menuRestEvent.Reset();
Thread.Sleep(1000);
_menuRestEvent.WaitOne();
MessageBox.Show("t2 step2 end");
}
咱们对//_menuRestEvent.Reset()进行了注释,也就是说, _menuRestEvent.Set()后,线程的状态就是true状态的,程序运行的结果是"t1 step1 end"、"t1 step2 end"、"t1 step2 end"、"t2 step2 end"在3秒以后所有弹出。
而若是咱们将//_menuRestEvent.Reset()的注释去掉,会发现"t1 step2 end"和"t2 step2 end"永远不会弹出。除非咱们在主线程中再次对_menuRestEvent进行Set()。

_manualResetEvent .Set();的这句话我想你们都明白了,能够看作将IsRelease的属性设置为true.线程1中

_manualResetEvent.WaitOne();接收到信号后再也不阻塞线程1。在此以后的整个过程当中IsRelease的值都是true.若是

想将IsRelease的值回复成false,就必须再调用_manualResetEvent.Reset()的方法。

若是是_autoResetEvent.set(),那么_autoResetEvent.WaitOne()后会自动将IsRelease的值自动设置为false。

相关文章
相关标签/搜索