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可實現一次只有一個被阻止的線程釋放。