WaitHandle、AutoResetEvent、ManualResetEvent整理

 

WaitHandle是一個用以控制線程同步的類,有WaitOne()方法,用以阻止當前線程(提前是其狀態爲Nonsignaled,即紅燈,後面解釋),直到當前的 WaitHandle 收到綠燈信號。
WaitHandle有兩個狀態"Signaled" and "Nonsignaled"前者可以理解爲綠燈,綠燈狀態時WaitOne方法無效,當前線程不會被阻止,後者可以理解爲紅燈,WaitOne()方法會阻止當前線程。
這兩個狀態是通過函數Set()和Reset()來設置的。前者設爲綠燈,後者設爲紅燈。

 
(1):一般來說,初始狀態都是"Nonsignaled",即紅燈,這樣當WaitOne時,線程會暫停掉,這正是通常情況下我們調用WaitOne時想要的效果。這也正是Reset(字面義“重置”)被定義爲設成紅燈的原因。所以初始化時參數用false,代表初始狀態爲紅燈
ManualResetEvent manualWait = new ManualResetEvent(false);
(2)WaitHandle沒有Set方法,所以不能使暫停的線程得以繼續,所以 一般不單用WaitHandle。其常會用作參數,尤其是AutoResetEvent和ManualResetEvent都用到的情況,提供一定的通用性。

 
AutoResetEvent、ManualResetEvent都繼承自WaitHandle,都有Set()和Reset()方法,當然也繼承了WaitOne()方法和兩個狀態。
(1)ManualResetEvent的Set()和Reset()方法即上面的功能,將狀態分別設成綠燈和紅燈。
(2)AutoResetEvent比較特別,正如名字所示,在Set()完後,它會立即自動調用Reset,所以一般只用Set()方法。

 
說明:這類對象可以被用在多個併發線程中,只要調用WaitOne,則都會暫停運行。ManualResetEvent的Set,可以讓所有這些線程都繼續運行,Reset又都停止,而AutoResetEvent則通過Set可實現一次只有一個被阻止的線程釋放。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章