共用方式為


System.Threading.Monitor.Wait 方法

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

Wait(Object, Int32, Boolean) 方法

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

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

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

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

注意

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

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

注意

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

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

方法的 Pulse 備註會說明在沒有線程等候時呼叫時會發生什麼情況 Pulse

Wait(Object, TimeSpan, Boolean) 方法

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

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

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

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

注意

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

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

注意

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

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

方法的 Pulse 備註會說明在沒有線程等候時呼叫時會發生什麼情況 Pulse

結束內容

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

當您的程式代碼在非預設內容中執行時,指定 trueexitContext 讓線程在執行 方法之前 Wait 結束非預設 Managed 內容(也就是轉換至預設內容)。 在呼叫 Wait 方法完成之後,它會傳回原始的非預設內容。

當內容系結類別已 SynchronizationAttribute 套用 屬性時,這非常有用。 在此情況下,對類別成員的所有呼叫都會自動同步處理,而且同步處理網域是 類別的整個程式代碼主體。 如果成員呼叫堆疊中的程式代碼會呼叫 Wait 方法並指定 trueexitContext,則線程會結束同步處理定義域,允許在呼叫物件的任何成員時封鎖的線程繼續進行。 Wait方法傳回時,進行呼叫的線程必須等候重新進入同步處理網域。