【深度好文】多線程之WaitHandle-->派生EventWaitHandle事件構造-》AutoResetEvent、ManualResetEvent

AutoResetEvent/ManualResetEvent 都是繼承自 EventWaitHandle ,EventWaitHandle繼承自WaitHandle.this

 

在討論這個問題以前,咱們先了解這樣一種觀點,線程之間的通訊是經過發信號來進行溝通的。(這不是廢話)spa

 

      先來討論ManualResetEvent,討論過程當中我會穿插一些AutoResetEvent的內容,來作對比:線程

      ManualResetEvent均可以阻塞一個或多個線程,直到收到一個信號告訴ManualResetEvent不要再阻塞當前的線程。對象

能夠想象ManualResetEvent這個對象內部有一個Boolean類型的屬性IsRelease來控制是否要阻塞當前線程。這個屬性咱們在初始化的時候能夠設置它,如ManualResetEvent event=new ManualResetEvent(false);這就代表默認的屬性是要阻塞當前線程。繼承

      代碼舉例:it

        ManualResetEvent _manualResetEvent = new ManualResetEvent(false);event

        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 
        }object

        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()的方法。

相關文章
相關標籤/搜索