文章目錄
釋放對象上的鎖並阻止當前線程,直到它重新擷取該鎖。
命名空間:System.Threading
程式集:mscorlib(在 mscorlib.dll 中)
參數
-
obj
-
要在其上等待的對象。
傳回值
如果調用由於調用方重新擷取了指定對象的鎖而返回,則為 true。如果未重新擷取該鎖,則此方法不會返回。
異常
異常類型
條件
ArgumentNullException
obj 參數為 Null 參考(在 Visual Basic 中為 Nothing)。
SynchronizationLockException
調用線程不擁有指定對象的鎖。
ThreadInterruptedException
調用 Wait 的線程稍後從等待狀態中斷。當另一個線程調用此線程的 Interrupt 方法時會發生這種情況。
備忘
當前擁有指定對象上的鎖的線程調用此方法以釋放該對象,以便其他線程可以訪問它。調用方在等待重新擷取鎖期間被阻止。當調用方需要等待另一個線程操作導致的狀態更改時,將調用此方法。
當線程調用 Wait 時,它釋放對象的鎖並進入對象的等待隊列。對象的就緒隊列中的下一個線程(如果有)擷取鎖並擁有對對象的獨佔使用。所有調用 Wait 的線程都將留在等待隊列中,直到它們接收到由鎖的所有者發送的 Pulse 或 PulseAll 的訊號為止。如果發送了 Pulse,則隻影響位於等待隊列最前面的線程。如果發送了 PulseAll,則將影響正等待該對象的所有線程。接收到訊號後,一個或多個線程將離開等待隊列而進入就緒隊列。就緒隊列中的線程被允許重新擷取鎖。
當調用線程重新擷取對象上的鎖後,此方法將返回。請注意,如果鎖的持有人不調用 Pulse 或 PulseAll,則此方法將無限期地阻止。
調用方執行一次 Wait,與已為指定對象調用 Enter 的次數無關。概念上,Wait 方法儲存調用方對對象調用 Enter 的次數,並按完全釋放鎖定對象所需要的次數調用 Exit。然後調用方在等待重新擷取對象期間被阻止。當調用方重新擷取鎖時,系統按還原調用方的已儲存 Enter 計數所需要的次數調用 Enter。調用 Wait 僅釋放指定對象的鎖;如果調用方是其他對象的鎖的所有者,則不釋放這些鎖。
請注意,同步的對象包含若干引用,其中包括對當前擁有鎖的線程的引用、對就緒隊列(包含準備擷取鎖的線程)的引用和對等待隊列(包含等待對象狀態更改通知的線程)的引用。
Pulse、 PulseAll 和 Wait 方法必須從同步的代碼塊內調用。
Pulse 方法的備忘解釋如果在沒有任何線程在等待時調用 Pulse 會發生什麼情況。
Monitor.Pulse 方法
通知等待隊列中的線程鎖定對象狀態的更改。
命名空間:System.Threading
程式集:mscorlib(在 mscorlib.dll 中)
參數
-
obj
-
線程正在等待的對象。
異常
異常類型
條件
ArgumentNullException
obj 參數為 Null 參考(在 Visual Basic 中為 Nothing)。
SynchronizationLockException
調用線程不擁有指定對象的鎖。
備忘
只有鎖的當前所有者可以使用 Pulse 向等待對象發出訊號。
當前擁有指定對象上的鎖的線程調用此方法以便向隊列中的下一個線程發出鎖的訊號。接收到脈衝後,等待線程就被移動到就緒隊列中。在調用 Pulse 的線程釋放鎖後,就緒隊列中的下一個線程(不一定是接收到脈衝的線程)將獲得該鎖。
重要事項:
Monitor 類不對指示 Pulse 方法已被調用的狀態進行維護。因此,如果您在沒有等待線程時調用 Pulse,則下一個調用 Wait 的線程將阻止,似乎 Pulse 從未被調用過。如果兩個線程正在使用 Pulse 和 Wait 互動,則可能導致死結。將其與 AutoResetEvent 類的行為相比較:如果您通過調用 AutoResetEvent 的 Set 方法向其發送訊號,在沒有等待線程時,AutoResetEvent 將一直保持終止狀態,直到線程調用 WaitOne、WaitAny 或 WaitAll。AutoResetEvent 釋放該線程並返回到未終止狀態。
請注意,同步的對象包含若干引用,其中包括對當前擁有鎖的線程的引用、對就緒隊列(包含準備擷取鎖的線程)的引用和對等待隊列(包含等待對象狀態更改通知的線程)的引用。
Pulse、 PulseAll 和 Wait 方法必須從同步的代碼塊內調用。
若要向多個線程發送訊號,請使用 PulseAll 方法。
請參考下面的文章:
調用Pulse方法時,如果ready隊列中沒有處於WaitSleepJoin狀態的線程,則即使以後有這樣的線程出現了,即使之前Pulse過n次,也是沒有作用滴(http://www.cnblogs.com/lovesanni/archive/2008/06/25/1229893.html)