共用方式為


System.Threading.Monitor.Wait 方法

本文提供此 API 參考文件的補充備註。

Wait(Object, Int32, Boolean) 方法

這個方法在重新取得參數的 obj 獨佔鎖定之前不會傳回。

目前擁有指定物件鎖定的線程會叫用這個方法,以便釋放物件,讓另一個線程可以存取它。 呼叫者在等待重新取得鎖定時遭到封鎖。 呼叫端需要等候因另一個線程作業而發生的狀態變更時,就會呼叫這個方法。

逾時可確保如果另一個線程在不先呼叫 PulsePulseAll 方法的情況下釋放鎖定,則目前的線程不會無限期封鎖。 它也會將執行緒移至就緒佇列,略過在等候佇列中排在前面的其他執行緒,以便更快重新取得鎖定。 執行緒可以測試 Wait 方法的傳回值,以判斷是否在逾時之前重新取得鎖定。執行緒可以評估導致其進入等待的條件,如有必要,可以再次呼叫 Wait 方法。

當線程呼叫 Wait時,它會釋放鎖定並進入等候佇列。 此時,就緒佇列中的下一個執行緒(如果有的話)可以取得鎖的控制權。 叫 Wait 用的線程會保留在等候佇列中,直到保留鎖定的線程叫用 PulseAll為止,或者它是佇列中的下一個線程,以及保留鎖定的線程會叫用 Pulse。 不過,如果在另一個線程叫用此物件的 millisecondsTimeoutPulse 方法之前 PulseAll 經過,原始線程會被移至就緒佇列,以重新取得鎖定。

備註

如果為 Infinite 參數指定 millisecondsTimeout,則該方法將無限期封鎖,除非鎖定的持有者呼叫 PulsePulseAll。 如果 millisecondsTimeout 等於 0,呼叫 的線程 Wait 會釋放鎖定,然後立即進入就緒佇列以重新取得鎖定。

不論指定的物件被叫用多少次,呼叫端仍會執行 Wait 一次。 就概念上來說, Wait 方法會儲存呼叫端在 物件上叫 Enter 用的次數,並 Exit 視需要叫用多次,以完全釋放鎖定的物件。 呼叫者接著在等候重新取得物件時會封鎖。 當呼叫端重新取得鎖定時,系統會視需要多次呼叫 Enter 來還原呼叫端的已儲存 Enter 計數。 呼叫 Wait 只會釋放指定對象的鎖定;如果呼叫端是其他對象的鎖定擁有者,則不會釋放這些鎖定。

備註

同步處理的物件會保存數個參考,包括目前保存鎖定的線程參考、就緒佇列的參考、包含準備取得鎖定的線程,以及等候佇列的參考,其中包含正在等待對象狀態變更通知的線程。

必須在同步處理的程式代碼區塊內叫用PulsePulseAllWait方法。

Pulse 方法的備註說明如果在沒有執行緒等候時呼叫 Pulse,會發生什麼情況。

Wait(Object, TimeSpan, Boolean) 方法

這個方法在重新取得參數的 obj 獨佔鎖定之前不會傳回。

目前擁有指定物件鎖定的線程會叫用這個方法,以便釋放物件,讓另一個線程可以存取它。 呼叫者在等待重新取得鎖定時遭到封鎖。 呼叫端需要等候因另一個線程作業而發生的狀態變更時,就會呼叫這個方法。

逾時可確保如果另一個線程在不先呼叫 PulsePulseAll 方法的情況下釋放鎖定,則目前的線程不會無限期封鎖。 它也會將執行緒移至就緒佇列,略過在等候佇列中排在前面的其他執行緒,以便更快重新取得鎖定。 執行緒可以測試 Wait 方法的傳回值,以判斷是否在逾時之前重新取得鎖定。執行緒可以評估導致其進入等待的條件,如有必要,可以再次呼叫 Wait 方法。

當線程呼叫 Wait時,它會釋放鎖定並進入等候佇列。 此時,就緒佇列中的下一個執行緒(如果有的話)可以取得鎖的控制權。 叫 Wait 用的線程會保留在等候佇列中,直到保留鎖定的線程叫用 PulseAll為止,或者它是佇列中的下一個線程,以及保留鎖定的線程會叫用 Pulse。 不過,如果在另一個線程叫用這個物件的 timeoutPulse 方法之前經過 PulseAll 毫秒,原始線程就會移至就緒佇列,以重新取得鎖。

備註

TimeSpan 如果為 timeout 參數指定了一個表示 -1 毫秒的值,則此方法會無限期地封鎖,除非鎖的持有者呼叫 PulsePulseAll。 如果 timeout 為 0 毫秒,則呼叫 Wait 的線程會釋放鎖定,然後立即進入就緒佇列,以重新取得鎖定。

不論指定的物件被叫用多少次,呼叫端仍會執行 Wait 一次。 就概念上來說, Wait 方法會儲存呼叫端在 物件上叫 Enter 用的次數,並 Exit 視需要叫用多次,以完全釋放鎖定的物件。 呼叫者接著在等候重新取得物件時會封鎖。 當呼叫端重新取得鎖定時,系統會視需要多次呼叫 Enter 來還原呼叫端的已儲存 Enter 計數。 呼叫 Wait 只會釋放指定對象的鎖定;如果呼叫端是其他對象的鎖定擁有者,則不會釋放這些鎖定。

備註

同步處理的物件會保存數個參考,包括目前保存鎖定的線程參考、就緒佇列的參考、包含準備取得鎖定的線程,以及等候佇列的參考,其中包含正在等待對象狀態變更通知的線程。

必須在同步處理的程式代碼區塊內叫用PulsePulseAllWait方法。

Pulse 方法的備註說明如果在沒有執行緒等候時呼叫 Pulse,會發生什麼情況。

離開上下文

除非從非預設受控環境內呼叫exitContext方法,否則Wait參數不會有任何作用。 如果您的執行緒正在呼叫衍生自 ContextBoundObject 的類別實例時,可能會發生此情況。 即使您目前在不是衍生自 ContextBoundObject的類別上執行方法,例如 String,如果 ContextBoundObject 位於目前應用程式域中的堆疊上,您也可以在非預設內容中。

當您的程式碼在非預設上下文中執行時,指定 true 會使線程在執行 exitContext 方法之前離開非預設管理的上下文,並轉換到預設上下文。 在呼叫 Wait 方法完成之後,它會傳回原始的非預設內容。

當具有上下文綁定的類別已套用 SynchronizationAttribute 屬性時,就非常有用。 在此情況下,對類別成員的所有呼叫都會自動同步處理,而且同步處理網域是 類別的整個程式代碼主體。 如果成員呼叫堆疊中的程式碼呼叫 Wait 方法並為 true 指定 exitContext,則執行緒會退出同步域,允許其他因呼叫此物件成員而被阻塞的執行緒繼續進行。 Wait方法傳回時,進行呼叫的線程必須等候重新進入同步處理網域。