Monitor.Wait 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
解除物件的鎖定,並阻塞當前執行緒直到它重新取得鎖定。
多載
| 名稱 | Description |
|---|---|
| Wait(Object, Int32, Boolean) |
解除物件的鎖定,並阻塞當前執行緒直到它重新取得鎖定。 若逾時間隔超過,執行緒進入準備隊列。 此方法同時指定上下文的同步域(若在同步上下文中)是否在等待前退出,等待後再重新取得。 |
| Wait(Object) |
解除物件的鎖定,並阻塞當前執行緒直到它重新取得鎖定。 |
| Wait(Object, Int32) |
解除物件的鎖定,並阻塞當前執行緒直到它重新取得鎖定。 若逾時間隔超過,執行緒進入準備隊列。 |
| Wait(Object, TimeSpan) |
解除物件的鎖定,並阻塞當前執行緒直到它重新取得鎖定。 若逾時間隔超過,執行緒進入準備隊列。 |
| Wait(Object, TimeSpan, Boolean) |
解除物件的鎖定,並阻塞當前執行緒直到它重新取得鎖定。 若逾時間隔超過,執行緒進入準備隊列。 可選擇性地在等待前退出同步上下文的同步域,等待後重新取得該域。 |
Wait(Object, Int32, Boolean)
- 來源:
- Monitor.cs
- 來源:
- Monitor.cs
- 來源:
- Monitor.cs
- 來源:
- Monitor.cs
- 來源:
- Monitor.cs
解除物件的鎖定,並阻塞當前執行緒直到它重新取得鎖定。 若逾時間隔超過,執行緒進入準備隊列。 此方法同時指定上下文的同步域(若在同步上下文中)是否在等待前退出,等待後再重新取得。
public:
static bool Wait(System::Object ^ obj, int millisecondsTimeout, bool exitContext);
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public static bool Wait(object obj, int millisecondsTimeout, bool exitContext);
public static bool Wait(object obj, int millisecondsTimeout, bool exitContext);
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
static member Wait : obj * int * bool -> bool
static member Wait : obj * int * bool -> bool
Public Shared Function Wait (obj As Object, millisecondsTimeout As Integer, exitContext As Boolean) As Boolean
參數
- obj
- Object
等待的對象。
- millisecondsTimeout
- Int32
等待的毫秒數,直到執行緒進入準備隊列。
- exitContext
- Boolean
true在等待前退出並重新取得上下文的同步域(若處於同步上下文);否則,。 false
傳回
true 若在指定時間內重新取得鎖; false 若在指定時間後重新取得。 該方法直到重新取得鎖才會回傳。
- 屬性
例外狀況
參數 obj 為 null。
Wait 不會從同步的程式碼區塊中呼叫。
呼叫 Wait 執行緒會被從等待狀態中中斷。 當另一個執行緒呼叫該執行緒的方法 Interrupt() 時,就會發生這種情況。
millisecondsTimeout參數值為負,且不等Infinite於。
備註
Wait(Object, Int32, Boolean) 方法
這個方法在重新取得參數的 obj 獨佔鎖定之前不會傳回。
目前擁有指定物件鎖定的線程會叫用這個方法,以便釋放物件,讓另一個線程可以存取它。 呼叫者在等待重新取得鎖定時遭到封鎖。 呼叫端需要等候因另一個線程作業而發生的狀態變更時,就會呼叫這個方法。
逾時可確保如果另一個線程在不先呼叫 Pulse 或 PulseAll 方法的情況下釋放鎖定,則目前的線程不會無限期封鎖。 它也會將執行緒移至就緒佇列,略過在等候佇列中排在前面的其他執行緒,以便更快重新取得鎖定。 執行緒可以測試 Wait 方法的傳回值,以判斷是否在逾時之前重新取得鎖定。執行緒可以評估導致其進入等待的條件,如有必要,可以再次呼叫 Wait 方法。
當線程呼叫 Wait時,它會釋放鎖定並進入等候佇列。 此時,就緒佇列中的下一個執行緒(如果有的話)可以取得鎖的控制權。 叫 Wait 用的線程會保留在等候佇列中,直到保留鎖定的線程叫用 PulseAll為止,或者它是佇列中的下一個線程,以及保留鎖定的線程會叫用 Pulse。 不過,如果在另一個線程叫用此物件的 millisecondsTimeout 或 Pulse 方法之前 PulseAll 經過,原始線程會被移至就緒佇列,以重新取得鎖定。
Note
如果為 Infinite 參數指定 millisecondsTimeout,則該方法將無限期封鎖,除非鎖定的持有者呼叫 Pulse 或 PulseAll。 如果 millisecondsTimeout 等於 0,呼叫 的線程 Wait 會釋放鎖定,然後立即進入就緒佇列以重新取得鎖定。
不論指定的物件被叫用多少次,呼叫端仍會執行 Wait 一次。 就概念上來說, Wait 方法會儲存呼叫端在 物件上叫 Enter 用的次數,並 Exit 視需要叫用多次,以完全釋放鎖定的物件。 呼叫者接著在等候重新取得物件時會封鎖。 當呼叫端重新取得鎖定時,系統會視需要多次呼叫 Enter 來還原呼叫端的已儲存 Enter 計數。 呼叫 Wait 只會釋放指定對象的鎖定;如果呼叫端是其他對象的鎖定擁有者,則不會釋放這些鎖定。
Note
同步處理的物件會保存數個參考,包括目前保存鎖定的線程參考、就緒佇列的參考、包含準備取得鎖定的線程,以及等候佇列的參考,其中包含正在等待對象狀態變更通知的線程。
必須在同步處理的程式代碼區塊內叫用Pulse、PulseAll和Wait方法。
Pulse 方法的備註說明如果在沒有執行緒等候時呼叫 Pulse,會發生什麼情況。
Wait(Object, TimeSpan, Boolean) 方法
這個方法在重新取得參數的 obj 獨佔鎖定之前不會傳回。
目前擁有指定物件鎖定的線程會叫用這個方法,以便釋放物件,讓另一個線程可以存取它。 呼叫者在等待重新取得鎖定時遭到封鎖。 呼叫端需要等候因另一個線程作業而發生的狀態變更時,就會呼叫這個方法。
逾時可確保如果另一個線程在不先呼叫 Pulse 或 PulseAll 方法的情況下釋放鎖定,則目前的線程不會無限期封鎖。 它也會將執行緒移至就緒佇列,略過在等候佇列中排在前面的其他執行緒,以便更快重新取得鎖定。 執行緒可以測試 Wait 方法的傳回值,以判斷是否在逾時之前重新取得鎖定。執行緒可以評估導致其進入等待的條件,如有必要,可以再次呼叫 Wait 方法。
當線程呼叫 Wait時,它會釋放鎖定並進入等候佇列。 此時,就緒佇列中的下一個執行緒(如果有的話)可以取得鎖的控制權。 叫 Wait 用的線程會保留在等候佇列中,直到保留鎖定的線程叫用 PulseAll為止,或者它是佇列中的下一個線程,以及保留鎖定的線程會叫用 Pulse。 不過,如果在另一個線程叫用這個物件的 timeout 或 Pulse 方法之前經過 PulseAll 毫秒,原始線程就會移至就緒佇列,以重新取得鎖。
Note
TimeSpan 如果為 timeout 參數指定了一個表示 -1 毫秒的值,則此方法會無限期地封鎖,除非鎖的持有者呼叫 Pulse 或 PulseAll。 如果 timeout 為 0 毫秒,則呼叫 Wait 的線程會釋放鎖定,然後立即進入就緒佇列,以重新取得鎖定。
不論指定的物件被叫用多少次,呼叫端仍會執行 Wait 一次。 就概念上來說, Wait 方法會儲存呼叫端在 物件上叫 Enter 用的次數,並 Exit 視需要叫用多次,以完全釋放鎖定的物件。 呼叫者接著在等候重新取得物件時會封鎖。 當呼叫端重新取得鎖定時,系統會視需要多次呼叫 Enter 來還原呼叫端的已儲存 Enter 計數。 呼叫 Wait 只會釋放指定對象的鎖定;如果呼叫端是其他對象的鎖定擁有者,則不會釋放這些鎖定。
Note
同步處理的物件會保存數個參考,包括目前保存鎖定的線程參考、就緒佇列的參考、包含準備取得鎖定的線程,以及等候佇列的參考,其中包含正在等待對象狀態變更通知的線程。
必須在同步處理的程式代碼區塊內叫用Pulse、PulseAll和Wait方法。
Pulse 方法的備註說明如果在沒有執行緒等候時呼叫 Pulse,會發生什麼情況。
離開上下文
除非方法在非預設的受管理上下文中呼叫,exitContext否則該Wait參數不會產生影響。 如果您的執行緒正在呼叫衍生自 ContextBoundObject 的類別實例時,可能會發生此情況。 即使您目前在不是衍生自 ContextBoundObject的類別上執行方法,例如 String,如果 ContextBoundObject 位於目前應用程式域中的堆疊上,您也可以在非預設內容中。
當您的程式碼在非預設上下文中執行時,指定 true 會使線程在執行 exitContext 方法之前離開非預設管理的上下文,並轉換到預設上下文。 在呼叫 Wait 方法完成之後,它會傳回原始的非預設內容。
當具有上下文綁定的類別已套用 SynchronizationAttribute 屬性時,就非常有用。 在此情況下,對類別成員的所有呼叫都會自動同步處理,而且同步處理網域是 類別的整個程式代碼主體。 如果成員呼叫堆疊中的程式碼呼叫 Wait 方法並為 true 指定 exitContext,則執行緒會退出同步域,允許其他因呼叫此物件成員而被阻塞的執行緒繼續進行。
Wait方法傳回時,進行呼叫的線程必須等候重新進入同步處理網域。
另請參閱
適用於
Wait(Object)
- 來源:
- Monitor.cs
- 來源:
- Monitor.cs
- 來源:
- Monitor.cs
- 來源:
- Monitor.cs
- 來源:
- Monitor.cs
解除物件的鎖定,並阻塞當前執行緒直到它重新取得鎖定。
public:
static bool Wait(System::Object ^ obj);
public static bool Wait(object obj);
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public static bool Wait(object obj);
static member Wait : obj -> bool
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
static member Wait : obj -> bool
Public Shared Function Wait (obj As Object) As Boolean
參數
- obj
- Object
等待的對象。
傳回
true 如果呼叫回傳,是因為呼叫者重新取得指定物件的鎖定。 若未重新取得鎖,此方法不會回傳。
- 屬性
例外狀況
參數 obj 為 null。
呼叫執行緒不擁有指定物件的鎖。
呼叫 Wait 執行緒會被從等待狀態中中斷。 當另一個執行緒呼叫該執行緒的方法 Interrupt() 時,就會發生這種情況。
備註
目前擁有指定物件鎖定的線程會叫用這個方法,以便釋放物件,讓另一個線程可以存取它。 呼叫者在等待重新取得鎖定時遭到封鎖。 呼叫端需要等候因另一個線程作業而發生的狀態變更時,就會呼叫這個方法。
當執行緒呼叫 Wait時,會解除對物件的鎖定,並進入物件的等待佇列。 物件的 ready 佇列中下一個執行緒(如果有的話)會取得鎖,並對該物件擁有獨佔使用權。 所有呼叫 Wait 的執行緒都會留在等待佇列中,直到收到由鎖擁有者發出的 Pulse or PulseAll發送的訊號。 如果 Pulse 是 發送,只有等待隊列頂端的執行緒會受到影響。 如果 PulseAll 是 傳送,所有等待該物件的執行緒都會受到影響。 當收到訊號時,一個或多個執行緒會離開等待佇列,進入準備佇列。 準備隊列中的執行緒被允許重新取得該鎖。
當呼叫執行緒重新取得物件鎖定時,此方法會回傳。 請注意,若鎖持有者不呼叫 Pulse 或 PulseAll,此方法將無限阻塞。
不論指定的物件被叫用多少次,呼叫端仍會執行 Wait 一次。 就概念上來說, Wait 方法會儲存呼叫端在 物件上叫 Enter 用的次數,並 Exit 視需要叫用多次,以完全釋放鎖定的物件。 呼叫者接著在等候重新取得物件時會封鎖。 當呼叫端重新取得鎖定時,系統會視需要多次呼叫 Enter 來還原呼叫端的已儲存 Enter 計數。 呼叫 Wait 只會釋放指定對象的鎖定;如果呼叫端是其他對象的鎖定擁有者,則不會釋放這些鎖定。
請注意,同步物件會保留多個參考,包括目前持有鎖的執行緒參考、準備佇列(包含準備取得鎖的執行緒)以及等待佇列(等待物件狀態變更通知的執行緒)的參考。
必須在同步處理的程式代碼區塊內叫用Pulse、PulseAll和Wait方法。
Pulse 方法的備註說明如果在沒有執行緒等候時呼叫 Pulse,會發生什麼情況。
另請參閱
適用於
Wait(Object, Int32)
- 來源:
- Monitor.cs
解除物件的鎖定,並阻塞當前執行緒直到它重新取得鎖定。 若逾時間隔超過,執行緒進入準備隊列。
public:
static bool Wait(System::Object ^ obj, int millisecondsTimeout);
public static bool Wait(object obj, int millisecondsTimeout);
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public static bool Wait(object obj, int millisecondsTimeout);
static member Wait : obj * int -> bool
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
static member Wait : obj * int -> bool
Public Shared Function Wait (obj As Object, millisecondsTimeout As Integer) As Boolean
參數
- obj
- Object
等待的對象。
- millisecondsTimeout
- Int32
等待的毫秒數,直到執行緒進入準備隊列。
傳回
true 若在指定時間內重新取得鎖; false 若在指定時間後重新取得。 該方法直到重新取得鎖才會回傳。
- 屬性
例外狀況
參數 obj 為 null。
呼叫執行緒不擁有指定物件的鎖。
呼叫 Wait 執行緒會被從等待狀態中中斷。 當另一個執行緒呼叫該執行緒的方法 Interrupt() 時,就會發生這種情況。
millisecondsTimeout參數值為負,且不等Infinite於。
備註
這個方法在重新取得參數的 obj 獨佔鎖定之前不會傳回。
目前擁有指定物件鎖定的線程會叫用這個方法,以便釋放物件,讓另一個線程可以存取它。 呼叫者在等待重新取得鎖定時遭到封鎖。 呼叫端需要等候因另一個線程作業而發生的狀態變更時,就會呼叫這個方法。
逾時可確保如果另一個線程在不先呼叫 Pulse 或 PulseAll 方法的情況下釋放鎖定,則目前的線程不會無限期封鎖。 它也會將執行緒移至就緒佇列,略過在等候佇列中排在前面的其他執行緒,以便更快重新取得鎖定。 執行緒可以測試 Wait 方法的傳回值,以判斷是否在逾時之前重新取得鎖定。執行緒可以評估導致其進入等待的條件,如有必要,可以再次呼叫 Wait 方法。
當執行緒呼叫 Wait時,會解除對物件的鎖定,並進入物件的等待佇列。 物件的 ready 佇列中下一個執行緒(如果有的話)會取得鎖,並對該物件擁有獨佔使用權。 叫 Wait 用的線程會保留在等候佇列中,直到保留鎖定的線程叫用 PulseAll為止,或者它是佇列中的下一個線程,以及保留鎖定的線程會叫用 Pulse。 不過,如果在另一個線程叫用此物件的 millisecondsTimeout 或 Pulse 方法之前 PulseAll 經過,原始線程會被移至就緒佇列,以重新取得鎖定。
Note
如果為 Infinite 參數指定 millisecondsTimeout,則該方法將無限期封鎖,除非鎖定的持有者呼叫 Pulse 或 PulseAll。 如果 millisecondsTimeout 等於 0,呼叫 的線程 Wait 會釋放鎖定,然後立即進入就緒佇列以重新取得鎖定。
不論指定的物件被叫用多少次,呼叫端仍會執行 Wait 一次。 就概念上來說, Wait 方法會儲存呼叫端在 物件上叫 Enter 用的次數,並 Exit 視需要叫用多次,以完全釋放鎖定的物件。 呼叫者接著在等候重新取得物件時會封鎖。 當呼叫端重新取得鎖定時,系統會視需要多次呼叫 Enter 來還原呼叫端的已儲存 Enter 計數。 呼叫 Wait 只會釋放指定對象的鎖定;如果呼叫端是其他對象的鎖定擁有者,則不會釋放這些鎖定。
Note
同步處理的物件會保存數個參考,包括目前保存鎖定的線程參考、就緒佇列的參考、包含準備取得鎖定的線程,以及等候佇列的參考,其中包含正在等待對象狀態變更通知的線程。
必須在同步處理的程式代碼區塊內叫用Pulse、PulseAll和Wait方法。
Pulse 方法的備註說明如果在沒有執行緒等候時呼叫 Pulse,會發生什麼情況。
另請參閱
適用於
Wait(Object, TimeSpan)
- 來源:
- Monitor.cs
- 來源:
- Monitor.cs
- 來源:
- Monitor.cs
- 來源:
- Monitor.cs
- 來源:
- Monitor.cs
解除物件的鎖定,並阻塞當前執行緒直到它重新取得鎖定。 若逾時間隔超過,執行緒進入準備隊列。
public:
static bool Wait(System::Object ^ obj, TimeSpan timeout);
public static bool Wait(object obj, TimeSpan timeout);
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public static bool Wait(object obj, TimeSpan timeout);
static member Wait : obj * TimeSpan -> bool
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
static member Wait : obj * TimeSpan -> bool
Public Shared Function Wait (obj As Object, timeout As TimeSpan) As Boolean
參數
- obj
- Object
等待的對象。
傳回
true 若在指定時間內重新取得鎖; false 若在指定時間後重新取得。 該方法直到重新取得鎖才會回傳。
- 屬性
例外狀況
參數 obj 為 null。
呼叫執行緒不擁有指定物件的鎖。
呼叫 Wait 執行緒會被從等待狀態中中斷。 當另一個執行緒呼叫該執行緒的方法 Interrupt() 時,就會發生這種情況。
參數的毫 timeout 秒值為負值,且不代表 Infinite (-1 毫秒),也不大於 Int32.MaxValue。
備註
這個方法在重新取得參數的 obj 獨佔鎖定之前不會傳回。
目前擁有指定物件鎖定的線程會叫用這個方法,以便釋放物件,讓另一個線程可以存取它。 呼叫者在等待重新取得鎖定時遭到封鎖。 呼叫端需要等候因另一個線程作業而發生的狀態變更時,就會呼叫這個方法。
逾時可確保如果另一個線程在不先呼叫 Pulse 或 PulseAll 方法的情況下釋放鎖定,則目前的線程不會無限期封鎖。 它也會將執行緒移至就緒佇列,略過在等候佇列中排在前面的其他執行緒,以便更快重新取得鎖定。 執行緒可以測試 Wait 方法的傳回值,以判斷是否在逾時之前重新取得鎖定。執行緒可以評估導致其進入等待的條件,如有必要,可以再次呼叫 Wait 方法。
當執行緒呼叫 Wait時,會解除對物件的鎖定,並進入物件的等待佇列。 物件的 ready 佇列中下一個執行緒(如果有的話)會取得鎖,並對該物件擁有獨佔使用權。 叫 Wait 用的線程會保留在等候佇列中,直到保留鎖定的線程叫用 PulseAll為止,或者它是佇列中的下一個線程,以及保留鎖定的線程會叫用 Pulse。 不過,如果在另一個線程叫用此物件的 timeout 或 Pulse 方法之前 PulseAll 經過,原始線程會被移至就緒佇列,以重新取得鎖定。
Note
TimeSpan 如果為 timeout 參數指定了一個表示 -1 毫秒的值,則此方法會無限期地封鎖,除非鎖的持有者呼叫 Pulse 或 PulseAll。 如果 timeout 為 0 毫秒,則呼叫 Wait 的線程會釋放鎖定,然後立即進入就緒佇列,以重新取得鎖定。
不論指定的物件被叫用多少次,呼叫端仍會執行 Wait 一次。 就概念上來說, Wait 方法會儲存呼叫端在 物件上叫 Enter 用的次數,並 Exit 視需要叫用多次,以完全釋放鎖定的物件。 呼叫者接著在等候重新取得物件時會封鎖。 當呼叫端重新取得鎖定時,系統會視需要多次呼叫 Enter 來還原呼叫端的已儲存 Enter 計數。 呼叫 Wait 只會釋放指定對象的鎖定;如果呼叫端是其他對象的鎖定擁有者,則不會釋放這些鎖定。
Note
同步處理的物件會保存數個參考,包括目前保存鎖定的線程參考、就緒佇列的參考、包含準備取得鎖定的線程,以及等候佇列的參考,其中包含正在等待對象狀態變更通知的線程。
必須在同步處理的程式代碼區塊內叫用Pulse、PulseAll和Wait方法。
Pulse 方法的備註說明如果在沒有執行緒等候時呼叫 Pulse,會發生什麼情況。
另請參閱
適用於
Wait(Object, TimeSpan, Boolean)
- 來源:
- Monitor.cs
- 來源:
- Monitor.cs
- 來源:
- Monitor.cs
- 來源:
- Monitor.cs
- 來源:
- Monitor.cs
解除物件的鎖定,並阻塞當前執行緒直到它重新取得鎖定。 若逾時間隔超過,執行緒進入準備隊列。 可選擇性地在等待前退出同步上下文的同步域,等待後重新取得該域。
public:
static bool Wait(System::Object ^ obj, TimeSpan timeout, bool exitContext);
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public static bool Wait(object obj, TimeSpan timeout, bool exitContext);
public static bool Wait(object obj, TimeSpan timeout, bool exitContext);
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
static member Wait : obj * TimeSpan * bool -> bool
static member Wait : obj * TimeSpan * bool -> bool
Public Shared Function Wait (obj As Object, timeout As TimeSpan, exitContext As Boolean) As Boolean
參數
- obj
- Object
等待的對象。
- exitContext
- Boolean
true在等待前退出並重新取得上下文的同步域(若處於同步上下文);否則,。 false
傳回
true 若在指定時間內重新取得鎖; false 若在指定時間後重新取得。 該方法直到重新取得鎖才會回傳。
- 屬性
例外狀況
參數 obj 為 null。
Wait 不會從同步的程式碼區塊中呼叫。
呼叫等待的執行緒會從等待狀態中被中斷。 當另一個執行緒呼叫該執行緒的方法 Interrupt() 時,就會發生這種情況。
參數 timeout 為負值,且不代表 Infinite (-1 毫秒),也不大於 Int32.MaxValue。
備註
Wait(Object, Int32, Boolean) 方法
這個方法在重新取得參數的 obj 獨佔鎖定之前不會傳回。
目前擁有指定物件鎖定的線程會叫用這個方法,以便釋放物件,讓另一個線程可以存取它。 呼叫者在等待重新取得鎖定時遭到封鎖。 呼叫端需要等候因另一個線程作業而發生的狀態變更時,就會呼叫這個方法。
逾時可確保如果另一個線程在不先呼叫 Pulse 或 PulseAll 方法的情況下釋放鎖定,則目前的線程不會無限期封鎖。 它也會將執行緒移至就緒佇列,略過在等候佇列中排在前面的其他執行緒,以便更快重新取得鎖定。 執行緒可以測試 Wait 方法的傳回值,以判斷是否在逾時之前重新取得鎖定。執行緒可以評估導致其進入等待的條件,如有必要,可以再次呼叫 Wait 方法。
當線程呼叫 Wait時,它會釋放鎖定並進入等候佇列。 此時,就緒佇列中的下一個執行緒(如果有的話)可以取得鎖的控制權。 叫 Wait 用的線程會保留在等候佇列中,直到保留鎖定的線程叫用 PulseAll為止,或者它是佇列中的下一個線程,以及保留鎖定的線程會叫用 Pulse。 不過,如果在另一個線程叫用此物件的 millisecondsTimeout 或 Pulse 方法之前 PulseAll 經過,原始線程會被移至就緒佇列,以重新取得鎖定。
Note
如果為 Infinite 參數指定 millisecondsTimeout,則該方法將無限期封鎖,除非鎖定的持有者呼叫 Pulse 或 PulseAll。 如果 millisecondsTimeout 等於 0,呼叫 的線程 Wait 會釋放鎖定,然後立即進入就緒佇列以重新取得鎖定。
不論指定的物件被叫用多少次,呼叫端仍會執行 Wait 一次。 就概念上來說, Wait 方法會儲存呼叫端在 物件上叫 Enter 用的次數,並 Exit 視需要叫用多次,以完全釋放鎖定的物件。 呼叫者接著在等候重新取得物件時會封鎖。 當呼叫端重新取得鎖定時,系統會視需要多次呼叫 Enter 來還原呼叫端的已儲存 Enter 計數。 呼叫 Wait 只會釋放指定對象的鎖定;如果呼叫端是其他對象的鎖定擁有者,則不會釋放這些鎖定。
Note
同步處理的物件會保存數個參考,包括目前保存鎖定的線程參考、就緒佇列的參考、包含準備取得鎖定的線程,以及等候佇列的參考,其中包含正在等待對象狀態變更通知的線程。
必須在同步處理的程式代碼區塊內叫用Pulse、PulseAll和Wait方法。
Pulse 方法的備註說明如果在沒有執行緒等候時呼叫 Pulse,會發生什麼情況。
Wait(Object, TimeSpan, Boolean) 方法
這個方法在重新取得參數的 obj 獨佔鎖定之前不會傳回。
目前擁有指定物件鎖定的線程會叫用這個方法,以便釋放物件,讓另一個線程可以存取它。 呼叫者在等待重新取得鎖定時遭到封鎖。 呼叫端需要等候因另一個線程作業而發生的狀態變更時,就會呼叫這個方法。
逾時可確保如果另一個線程在不先呼叫 Pulse 或 PulseAll 方法的情況下釋放鎖定,則目前的線程不會無限期封鎖。 它也會將執行緒移至就緒佇列,略過在等候佇列中排在前面的其他執行緒,以便更快重新取得鎖定。 執行緒可以測試 Wait 方法的傳回值,以判斷是否在逾時之前重新取得鎖定。執行緒可以評估導致其進入等待的條件,如有必要,可以再次呼叫 Wait 方法。
當線程呼叫 Wait時,它會釋放鎖定並進入等候佇列。 此時,就緒佇列中的下一個執行緒(如果有的話)可以取得鎖的控制權。 叫 Wait 用的線程會保留在等候佇列中,直到保留鎖定的線程叫用 PulseAll為止,或者它是佇列中的下一個線程,以及保留鎖定的線程會叫用 Pulse。 不過,如果在另一個線程叫用這個物件的 timeout 或 Pulse 方法之前經過 PulseAll 毫秒,原始線程就會移至就緒佇列,以重新取得鎖。
Note
TimeSpan 如果為 timeout 參數指定了一個表示 -1 毫秒的值,則此方法會無限期地封鎖,除非鎖的持有者呼叫 Pulse 或 PulseAll。 如果 timeout 為 0 毫秒,則呼叫 Wait 的線程會釋放鎖定,然後立即進入就緒佇列,以重新取得鎖定。
不論指定的物件被叫用多少次,呼叫端仍會執行 Wait 一次。 就概念上來說, Wait 方法會儲存呼叫端在 物件上叫 Enter 用的次數,並 Exit 視需要叫用多次,以完全釋放鎖定的物件。 呼叫者接著在等候重新取得物件時會封鎖。 當呼叫端重新取得鎖定時,系統會視需要多次呼叫 Enter 來還原呼叫端的已儲存 Enter 計數。 呼叫 Wait 只會釋放指定對象的鎖定;如果呼叫端是其他對象的鎖定擁有者,則不會釋放這些鎖定。
Note
同步處理的物件會保存數個參考,包括目前保存鎖定的線程參考、就緒佇列的參考、包含準備取得鎖定的線程,以及等候佇列的參考,其中包含正在等待對象狀態變更通知的線程。
必須在同步處理的程式代碼區塊內叫用Pulse、PulseAll和Wait方法。
Pulse 方法的備註說明如果在沒有執行緒等候時呼叫 Pulse,會發生什麼情況。
離開上下文
除非方法在非預設的受管理上下文中呼叫,exitContext否則該Wait參數不會產生影響。 如果您的執行緒正在呼叫衍生自 ContextBoundObject 的類別實例時,可能會發生此情況。 即使您目前在不是衍生自 ContextBoundObject的類別上執行方法,例如 String,如果 ContextBoundObject 位於目前應用程式域中的堆疊上,您也可以在非預設內容中。
當您的程式碼在非預設上下文中執行時,指定 true 會使線程在執行 exitContext 方法之前離開非預設管理的上下文,並轉換到預設上下文。 在呼叫 Wait 方法完成之後,它會傳回原始的非預設內容。
當具有上下文綁定的類別已套用 SynchronizationAttribute 屬性時,就非常有用。 在此情況下,對類別成員的所有呼叫都會自動同步處理,而且同步處理網域是 類別的整個程式代碼主體。 如果成員呼叫堆疊中的程式碼呼叫 Wait 方法並為 true 指定 exitContext,則執行緒會退出同步域,允許其他因呼叫此物件成員而被阻塞的執行緒繼續進行。
Wait方法傳回時,進行呼叫的線程必須等候重新進入同步處理網域。