【深度好文】多线程之WaitHandle--派生EventWaitHandle事件构造-》AutoResetEvent、ManualResetEvent...
AutoResetEvent/ManualResetEvent 都是繼承自 EventWaitHandle ,EventWaitHandle繼承自WaitHandle.
?
在討論這個問題之前,我們先了解這樣一種觀點,線程之間的通信是通過發信號來進行溝通的。(這不是廢話)
?
????? 先來討論ManualResetEvent,討論過程中我會穿插一些AutoResetEvent的內容,來做對比:
??????ManualResetEvent都可以阻塞一個或多個線程,直到收到一個信號告訴ManualResetEvent不要再阻塞當前的線程。
可以想象ManualResetEvent這個對象內部有一個Boolean類型的屬性IsRelease來控制是否要阻塞當前線程。這個屬性我們在初始化的時候可以設置它,如ManualResetEvent event=new ManualResetEvent(false);這就表明默認的屬性是要阻塞當前線程。
????? 代碼舉例:
??????? ManualResetEvent _manualResetEvent = new ManualResetEvent(false);
??????? private void BT_Temp_Click(object sender, RoutedEventArgs e)?
??????? {?
??????????? Thread t1 = new Thread(this.Thread1Foo);?
??????????? t1.Start();?//啟動線程1
??????????? Thread t2 = new Thread(this.Thread2Foo);?
??????????? t2.Start();?//啟動線程2
??????????? Thread.Sleep(3000);?//睡眠當前主線程,即調用BT_Temp_Click的線程
??????????? _manualResetEvent .Set();?? //想象成將IsRelease設為True?
??????? }
??????? void Thread1Foo()?
??????? {?
??????????? _manualResetEvent .WaitOne();?
//阻塞線程1,直到主線程發信號給線程1,告知_menuResetEvent你的IsRelease屬性已經為true,
//這時不再阻塞線程1,程序繼續往下跑
??????????? MessageBox.Show("t1 end");?
??????? }
??????? void Thread2Foo()?
??????? {?
??????????? _manualResetEvent .WaitOne();
//阻塞線程2,直到主線程發信號給線程1,告知_menuResetEvent你的IsRelease屬性已經為true,
//這時不再阻塞線程2,程序繼續往下跑
??????????? MessageBox.Show("t2 end");?
??????? }
?
?????? 注意這里ManualResetEvent和AutoResetEvent的一個重要區別:
?????? 1.manual的話肯定會給線程1和線程2都發送一個信號,而auto只會隨機給其中一個發送信號,也就是只有一方可以繼續行動。
?
?
?????? 為什么一個叫manual而一個叫auto呢?我想這是很多人的疑問,現在我們就來看這個問題。
? ? ? ?2.剛才_manualResetEvent?.Set();的這句話我想大家都明白了,可以看做將IsRelease的屬性設置為true.線程1中
?_manualResetEvent.WaitOne();接收到信號后不再阻塞線程1。在此之后的整個過程中IsRelease的值都是true.如果
想將IsRelease的值回復成false,就必須再調用_manualResetEvent.Reset()的方法。
??
?
轉載于:https://www.cnblogs.com/x-poior/p/6305652.html
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的【深度好文】多线程之WaitHandle--派生EventWaitHandle事件构造-》AutoResetEvent、ManualResetEvent...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL存储过程和函数(一)
- 下一篇: C#及时释放代码