System.Threading.Monitor.Wait 方法
本文提供此 API 參考文件的補充備註。
Wait(Object, Int32, Boolean) 方法
這個方法在重新取得參數的 obj
獨佔鎖定之前不會傳回。
目前擁有指定物件鎖定的線程會叫用這個方法,以便釋放物件,讓另一個線程可以存取它。 呼叫端在等候重新取得鎖定時遭到封鎖。 呼叫端需要等候因另一個線程作業而發生的狀態變更時,就會呼叫這個方法。
逾時可確保如果另一個線程在不先呼叫 Pulse 或 PulseAll 方法的情況下釋放鎖定,則目前的線程不會無限期封鎖。 它也會將線程移至就緒的佇列,在等候佇列中略過其他線程,以便更快重新取得鎖定。 線程可以測試 方法的 Wait 傳回值,以判斷是否在逾時之前重新取得鎖定。線程可以評估導致它進入等候的條件,並在必要時再次呼叫 Wait 方法。
當線程呼叫 Wait
時,它會釋放鎖定並進入等候佇列。 此時,就緒佇列中的下一個線程(如果有的話)可以控制鎖定。 叫 Wait
用的線程會保留在等候佇列中,直到保留鎖定的線程叫用 PulseAll為止,或者它是佇列中的下一個線程,以及保留鎖定的線程會叫用 Pulse。 不過,如果在 millisecondsTimeout
另一個線程叫用此物件的 Pulse 或 PulseAll 方法之前經過,原始線程會移至就緒佇列,以重新取得鎖定。
注意
如果 Infinite 為 millisecondsTimeout
參數指定,除非鎖定的持有者呼叫 Pulse 或 PulseAll,否則這個方法會無限期地封鎖 。 如果 millisecondsTimeout
等於 0,呼叫 的線程 Wait
會釋放鎖定,然後立即進入就緒佇列以重新取得鎖定。
呼叫端會 Wait
執行一次,不論指定的物件叫用的次數 Enter 為何。 就概念上來說, Wait
方法會儲存呼叫端在 物件上叫 Enter 用的次數,並 Exit 視需要叫用多次,以完全釋放鎖定的物件。 呼叫端接著會在等候重新取得 物件時封鎖 。 當呼叫端重新取得鎖定時,系統會視需要多次呼叫 Enter 來還原呼叫端的已儲存 Enter 計數。 呼叫 Wait
只會釋放指定對象的鎖定;如果呼叫端是其他對象的鎖定擁有者,則不會釋放這些鎖定。
注意
同步處理的物件會保存數個參考,包括目前保存鎖定的線程參考、就緒佇列的參考、包含準備取得鎖定的線程,以及等候佇列的參考,其中包含正在等待對象狀態變更通知的線程。
Pulse必須在同步處理的程式代碼區塊內叫用、 PulseAll和 Wait
方法。
方法的 Pulse 備註會說明在沒有線程等候時呼叫時會發生什麼情況 Pulse 。
Wait(Object, TimeSpan, Boolean) 方法
這個方法在重新取得參數的 obj
獨佔鎖定之前不會傳回。
目前擁有指定物件鎖定的線程會叫用這個方法,以便釋放物件,讓另一個線程可以存取它。 呼叫端在等候重新取得鎖定時遭到封鎖。 呼叫端需要等候因另一個線程作業而發生的狀態變更時,就會呼叫這個方法。
逾時可確保如果另一個線程在不先呼叫 Pulse 或 PulseAll 方法的情況下釋放鎖定,則目前的線程不會無限期封鎖。 它也會將線程移至就緒的佇列,在等候佇列中略過其他線程,以便更快重新取得鎖定。 線程可以測試 方法的 Wait 傳回值,以判斷是否在逾時之前重新取得鎖定。線程可以評估導致它進入等候的條件,並在必要時再次呼叫 Wait 方法。
當線程呼叫 Wait
時,它會釋放鎖定並進入等候佇列。 此時,就緒佇列中的下一個線程(如果有的話)可以控制鎖定。 叫 Wait
用的線程會保留在等候佇列中,直到保留鎖定的線程叫用 PulseAll為止,或者它是佇列中的下一個線程,以及保留鎖定的線程會叫用 Pulse。 不過,如果在 timeout
另一個線程叫用這個物件的 Pulse 或 PulseAll 方法之前經過毫秒,原始線程就會移至就緒佇列,以重新取得鎖定。
注意
TimeSpan如果為 參數指定代表 -1 毫秒的 timeout
,這個方法會無限期地封鎖,除非鎖定的持有者呼叫 Pulse 或 PulseAll。 如果 timeout
為 0 毫秒,則呼叫 Wait
的線程會釋放鎖定,然後立即進入就緒佇列,以重新取得鎖定。
呼叫端會 Wait
執行一次,不論指定的物件叫用的次數 Enter 為何。 就概念上來說, Wait
方法會儲存呼叫端在 物件上叫 Enter 用的次數,並 Exit 視需要叫用多次,以完全釋放鎖定的物件。 呼叫端接著會在等候重新取得 物件時封鎖 。 當呼叫端重新取得鎖定時,系統會視需要多次呼叫 Enter 來還原呼叫端的已儲存 Enter 計數。 呼叫 Wait
只會釋放指定對象的鎖定;如果呼叫端是其他對象的鎖定擁有者,則不會釋放這些鎖定。
注意
同步處理的物件會保存數個參考,包括目前保存鎖定的線程參考、就緒佇列的參考、包含準備取得鎖定的線程,以及等候佇列的參考,其中包含正在等待對象狀態變更通知的線程。
Pulse必須在同步處理的程式代碼區塊內叫用、 PulseAll和 Wait
方法。
方法的 Pulse 備註會說明在沒有線程等候時呼叫時會發生什麼情況 Pulse 。
結束內容
exitContext
除非從非預設 Managed 內容內呼叫 方法,Wait否則參數不會有任何作用。 如果您的線程是在對衍生自 ContextBoundObject之類別實例的呼叫內,就可能發生此情況。 即使您目前在不是衍生自 ContextBoundObject的類別上執行方法,例如 String,如果 ContextBoundObject 位於目前應用程式域中的堆疊上,您也可以在非預設內容中。
當您的程式代碼在非預設內容中執行時,指定 true
會 exitContext
讓線程在執行 方法之前 Wait 結束非預設 Managed 內容(也就是轉換至預設內容)。 在呼叫 Wait 方法完成之後,它會傳回原始的非預設內容。
當內容系結類別已 SynchronizationAttribute 套用 屬性時,這非常有用。 在此情況下,對類別成員的所有呼叫都會自動同步處理,而且同步處理網域是 類別的整個程式代碼主體。 如果成員呼叫堆疊中的程式代碼會呼叫 Wait 方法並指定 true
exitContext
,則線程會結束同步處理定義域,允許在呼叫物件的任何成員時封鎖的線程繼續進行。 Wait方法傳回時,進行呼叫的線程必須等候重新進入同步處理網域。