Monitor.Wait 方法

定義

解除物件的鎖定,並阻塞當前執行緒直到它重新取得鎖定。

多載

名稱 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 若在指定時間後重新取得。 該方法直到重新取得鎖才會回傳。

屬性

例外狀況

參數 objnull

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 如果呼叫回傳,是因為呼叫者重新取得指定物件的鎖定。 若未重新取得鎖,此方法不會回傳。

屬性

例外狀況

參數 objnull

呼叫執行緒不擁有指定物件的鎖。

呼叫 Wait 執行緒會被從等待狀態中中斷。 當另一個執行緒呼叫該執行緒的方法 Interrupt() 時,就會發生這種情況。

備註

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

當執行緒呼叫 Wait時,會解除對物件的鎖定,並進入物件的等待佇列。 物件的 ready 佇列中下一個執行緒(如果有的話)會取得鎖,並對該物件擁有獨佔使用權。 所有呼叫 Wait 的執行緒都會留在等待佇列中,直到收到由鎖擁有者發出的 Pulse or PulseAll發送的訊號。 如果 Pulse 是 發送,只有等待隊列頂端的執行緒會受到影響。 如果 PulseAll 是 傳送,所有等待該物件的執行緒都會受到影響。 當收到訊號時,一個或多個執行緒會離開等待佇列,進入準備佇列。 準備隊列中的執行緒被允許重新取得該鎖。

當呼叫執行緒重新取得物件鎖定時,此方法會回傳。 請注意,若鎖持有者不呼叫 PulsePulseAll,此方法將無限阻塞。

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

請注意,同步物件會保留多個參考,包括目前持有鎖的執行緒參考、準備佇列(包含準備取得鎖的執行緒)以及等待佇列(等待物件狀態變更通知的執行緒)的參考。

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

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

另請參閱

適用於

Wait(Object, Int32)

來源:
Monitor.CoreCLR.cs
來源:
Monitor.cs
來源:
Monitor.CoreCLR.cs
來源:
Monitor.CoreCLR.cs
來源:
Monitor.CoreCLR.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 若在指定時間後重新取得。 該方法直到重新取得鎖才會回傳。

屬性

例外狀況

參數 objnull

呼叫執行緒不擁有指定物件的鎖。

呼叫 Wait 執行緒會被從等待狀態中中斷。 當另一個執行緒呼叫該執行緒的方法 Interrupt() 時,就會發生這種情況。

millisecondsTimeout參數值為負,且不等Infinite於。

備註

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

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

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

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

備註

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

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

備註

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

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

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

等待的對象。

timeout
TimeSpan

A TimeSpan 代表執行緒進入待命隊列前的等待時間。

傳回

true 若在指定時間內重新取得鎖; false 若在指定時間後重新取得。 該方法直到重新取得鎖才會回傳。

屬性

例外狀況

參數 objnull

呼叫執行緒不擁有指定物件的鎖。

呼叫 Wait 執行緒會被從等待狀態中中斷。 當另一個執行緒呼叫該執行緒的方法 Interrupt() 時,就會發生這種情況。

參數的毫 timeout 秒值為負值,且不代表 Infinite (-1 毫秒),也不大於 Int32.MaxValue

備註

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

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

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

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

備註

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

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

備註

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

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

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

等待的對象。

timeout
TimeSpan

A TimeSpan 代表執行緒進入待命隊列前的等待時間。

exitContext
Boolean

true在等待前退出並重新取得上下文的同步域(若處於同步上下文);否則,。 false

傳回

true 若在指定時間內重新取得鎖; false 若在指定時間後重新取得。 該方法直到重新取得鎖才會回傳。

屬性

例外狀況

參數 objnull

Wait 不會從同步的程式碼區塊中呼叫。

呼叫等待的執行緒會從等待狀態中被中斷。 當另一個執行緒呼叫該執行緒的方法 Interrupt() 時,就會發生這種情況。

參數 timeout 為負值,且不代表 Infinite (-1 毫秒),也不大於 Int32.MaxValue

備註

欲了解更多關於此 API 的資訊,請參閱 Monitor.Wait 的補充 API 備註

另請參閱

適用於