程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> ManualResetEvent和AutoResetEvent的區別,分享來的,autoreseteventreset

ManualResetEvent和AutoResetEvent的區別,分享來的,autoreseteventreset

編輯:C#入門知識

ManualResetEvent和AutoResetEvent的區別,分享來的,autoreseteventreset


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

 

      先來討論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的一個重要區別:

       manual的話肯定會給線程1和線程2都發送一個信號,而auto只會隨機給其中一個發送信號。

 

 

       為什麼一個叫manual而一個叫auto呢?我想這是很多人的疑問,現在我們就來看這個問題。

       剛才_manualResetEvent .Set();的這句話我想大家都明白了,可以看做將IsRelease的屬性設置為true.線程1中

 _manualResetEvent.WaitOne();接收到信號後不再阻塞線程1。在此之後的整個過程中IsRelease的值都是true.如果

想將IsRelease的值回復成false,就必須再調用_manualResetEvent.Reset()的方法。

 

       如果是_autoResetEvent.set(),那麼_autoResetEvent.WaitOne()後會自動將IsRelease的值自動設置為false.

這就是為什麼一個叫auto,一個叫manual.

原文鏈接http://www.2cto.com/kf/201007/52946.html

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved