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於。
備註
欲了解更多關於此 API 的資訊,請參閱 Monitor.Wait 的補充 API 備註。
另請參閱
適用於
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 經過,原始線程會被移至就緒佇列,以重新取得鎖定。
備註
如果為 Infinite 參數指定 millisecondsTimeout,則該方法將無限期封鎖,除非鎖定的持有者呼叫 Pulse 或 PulseAll。 如果 millisecondsTimeout 等於 0,呼叫 的線程 Wait 會釋放鎖定,然後立即進入就緒佇列以重新取得鎖定。
不論指定的物件被叫用多少次,呼叫端仍會執行 Wait 一次。 就概念上來說, Wait 方法會儲存呼叫端在 物件上叫 Enter 用的次數,並 Exit 視需要叫用多次,以完全釋放鎖定的物件。 呼叫者接著在等候重新取得物件時會封鎖。 當呼叫端重新取得鎖定時,系統會視需要多次呼叫 Enter 來還原呼叫端的已儲存 Enter 計數。 呼叫 Wait 只會釋放指定對象的鎖定;如果呼叫端是其他對象的鎖定擁有者,則不會釋放這些鎖定。
備註
同步處理的物件會保存數個參考,包括目前保存鎖定的線程參考、就緒佇列的參考、包含準備取得鎖定的線程,以及等候佇列的參考,其中包含正在等待對象狀態變更通知的線程。
必須在同步處理的程式代碼區塊內叫用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 經過,原始線程會被移至就緒佇列,以重新取得鎖定。
備註
TimeSpan 如果為 timeout 參數指定了一個表示 -1 毫秒的值,則此方法會無限期地封鎖,除非鎖的持有者呼叫 Pulse 或 PulseAll。 如果 timeout 為 0 毫秒,則呼叫 Wait 的線程會釋放鎖定,然後立即進入就緒佇列,以重新取得鎖定。
不論指定的物件被叫用多少次,呼叫端仍會執行 Wait 一次。 就概念上來說, Wait 方法會儲存呼叫端在 物件上叫 Enter 用的次數,並 Exit 視需要叫用多次,以完全釋放鎖定的物件。 呼叫者接著在等候重新取得物件時會封鎖。 當呼叫端重新取得鎖定時,系統會視需要多次呼叫 Enter 來還原呼叫端的已儲存 Enter 計數。 呼叫 Wait 只會釋放指定對象的鎖定;如果呼叫端是其他對象的鎖定擁有者,則不會釋放這些鎖定。
備註
同步處理的物件會保存數個參考,包括目前保存鎖定的線程參考、就緒佇列的參考、包含準備取得鎖定的線程,以及等候佇列的參考,其中包含正在等待對象狀態變更通知的線程。
必須在同步處理的程式代碼區塊內叫用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。
備註
欲了解更多關於此 API 的資訊,請參閱 Monitor.Wait 的補充 API 備註。