Monitor.Wait 方法

定义

释放对象上的锁并阻止当前线程,直到它重新获取锁。

重载

名称 说明
Wait(Object, Int32, Boolean)

释放对象上的锁并阻止当前线程,直到它重新获取锁。 如果指定的超时间隔已过,线程将进入就绪队列。 此方法还指定上下文的同步域(如果在同步上下文中)在等待之前退出并随后重新获取。

Wait(Object)

释放对象上的锁并阻止当前线程,直到它重新获取锁。

Wait(Object, Int32)

释放对象上的锁并阻止当前线程,直到它重新获取锁。 如果指定的超时间隔已过,线程将进入就绪队列。

Wait(Object, TimeSpan)

释放对象上的锁并阻止当前线程,直到它重新获取锁。 如果指定的超时间隔已过,线程将进入就绪队列。

Wait(Object, TimeSpan, Boolean)

释放对象上的锁并阻止当前线程,直到它重新获取锁。 如果指定的超时间隔已过,线程将进入就绪队列。 (可选)在等待之前退出同步上下文的同步域,然后重新获取域。

Wait(Object, Int32, Boolean)

Source:
Monitor.cs
Source:
Monitor.cs
Source:
Monitor.cs
Source:
Monitor.cs
Source:
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)

Source:
Monitor.cs
Source:
Monitor.cs
Source:
Monitor.cs
Source:
Monitor.cs
Source:
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时,它会释放对象上的锁,并输入对象的等待队列。 对象的就绪队列(如果有)中的下一个线程获取锁并具有该对象的独占使用。 调用Wait的所有线程都保留在等待队列中,直到它们收到锁所有者发送的信号PulsePulseAll 如果 Pulse 发送,则只会影响等待队列的头上的线程。 如果 PulseAll 已发送,正在等待对象的所有线程都会受到影响。 收到信号后,一个或多个线程离开等待队列并进入就绪队列。 允许就绪队列中的线程重新获取锁。

此方法在调用线程重新获取对象上的锁时返回。 请注意,如果锁的持有者未调用 PulsePulseAll,此方法将无限期地阻止。

调用方仅执行一次 Wait,无论为指定对象调用 Enter 的次数是多少。 从概念上讲, Wait 该方法存储调用方在对象上调用 Enter 的次数,并根据需要多次调用 Exit 以完全释放锁定的对象。 然后,调用方在等待重新获取对象时阻止。 当调用方重新获取锁时,系统会根据需要多次调用 Enter 来还原调用方保存 Enter 的计数。 仅调用 Wait 释放指定对象的锁;如果调用方是其他对象的锁的所有者,则不会释放这些锁。

请注意,同步对象包含多个引用,包括对当前保存锁的线程的引用、对就绪队列的引用、包含准备获取锁的线程,以及对等待队列的引用,该引用包含等待通知对象状态更改的线程。

必须在同步的代码块内调用PulsePulseAllWait方法。

对于 Pulse 方法的注释解释了如果在没有线程等待时调用 Pulse 会发生什么。

另请参阅

适用于

Wait(Object, Int32)

Source:
Monitor.CoreCLR.cs
Source:
Monitor.cs
Source:
Monitor.CoreCLR.cs
Source:
Monitor.CoreCLR.cs
Source:
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时,它会释放对象上的锁,并输入对象的等待队列。 对象的就绪队列(如果有)中的下一个线程获取锁并具有该对象的独占使用。 调用 Wait 的线程将保留在等待队列中,直到持有锁的线程调用 PulseAll,或者它是队列中的下一个线程,还有一个持有锁的线程调用 Pulse。 但是,如果在另一个线程调用此对象的 millisecondsTimeoutPulse 方法之前 PulseAll 已经过期,则原始线程将被移动到就绪队列中以重新获取锁。

Note

如果为Infinite参数指定millisecondsTimeout,则此方法将无限期阻塞,除非持有锁的对象调用PulsePulseAll。 如果 millisecondsTimeout 等于 0,则调用 Wait 释放锁的线程,然后立即进入就绪队列以重新获得锁。

调用方仅执行一次 Wait,无论为指定对象调用 Enter 的次数是多少。 从概念上讲, Wait 该方法存储调用方在对象上调用 Enter 的次数,并根据需要多次调用 Exit 以完全释放锁定的对象。 然后,调用方在等待重新获取对象时阻止。 当调用方重新获取锁时,系统会根据需要多次调用 Enter 来还原调用方保存 Enter 的计数。 仅调用 Wait 释放指定对象的锁;如果调用方是其他对象的锁的所有者,则不会释放这些锁。

Note

同步对象包含多个引用,包括对当前保存锁的线程的引用、对就绪队列的引用、包含准备获取锁的线程,以及对等待队列的引用,其中包含等待通知对象状态更改的线程。

必须在同步的代码块内调用PulsePulseAllWait方法。

对于 Pulse 方法的注释解释了如果在没有线程等待时调用 Pulse 会发生什么。

另请参阅

适用于

Wait(Object, TimeSpan)

Source:
Monitor.cs
Source:
Monitor.cs
Source:
Monitor.cs
Source:
Monitor.cs
Source:
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

表示 TimeSpan 线程进入就绪队列之前等待的时间量。

返回

true 如果在指定时间过前重新获取锁, false 如果在指定时间过后重新获取锁。 在重新获取锁之前,该方法不会返回。

属性

例外

参数 objnull.

调用线程不拥有指定对象的锁。

调用 Wait 的线程稍后会从等待状态中断。 当另一个线程调用此线程 Interrupt() 的方法时,就会发生这种情况。

参数的值 timeout (以毫秒为单位)为负值,不表示 Infinite (-1 毫秒),或大于 Int32.MaxValue

注解

此方法在重新获取参数的 obj 排他锁之前不会返回。

当前拥有指定对象的锁的线程调用此方法,以便释放该对象,以便另一个线程可以访问它。 调用方在等待重新获取锁时被阻止。 当调用方需要等待由于另一个线程的作而发生的状态更改时,将调用此方法。

超时可确保如果另一个线程在不首先调用 PulsePulseAll 方法的情况下释放锁,则当前线程不会无限期阻止。 它还会将线程移到就绪队列,在等待队列中绕过其他线程,以便可以更快地重新获取锁。 线程可以测试方法的 Wait 返回值,以确定它在超时之前是否重新获取锁。线程可以评估导致它进入等待的条件,并在必要时再次调用 Wait 该方法。

当线程调用 Wait时,它会释放对象上的锁,并输入对象的等待队列。 对象的就绪队列(如果有)中的下一个线程获取锁并具有该对象的独占使用。 调用 Wait 的线程将保留在等待队列中,直到持有锁的线程调用 PulseAll,或者它是队列中的下一个线程,还有一个持有锁的线程调用 Pulse。 但是,如果在另一个线程调用此对象的 timeoutPulse 方法之前 PulseAll 已经过期,则原始线程将被移动到就绪队列中以重新获取锁。

Note

如果为TimeSpan参数指定了一个表示 -1 毫秒的timeout,此方法将无期限地阻塞,除非锁的持有者调用PulsePulseAll。 如果 timeout 为 0 毫秒,则调用 Wait 的线程会释放锁,然后立即进入就绪队列以重新获得锁。

调用方仅执行一次 Wait,无论为指定对象调用 Enter 的次数是多少。 从概念上讲, Wait 该方法存储调用方在对象上调用 Enter 的次数,并根据需要多次调用 Exit 以完全释放锁定的对象。 然后,调用方在等待重新获取对象时阻止。 当调用方重新获取锁时,系统会根据需要多次调用 Enter 来还原调用方保存 Enter 的计数。 仅调用 Wait 释放指定对象的锁;如果调用方是其他对象的锁的所有者,则不会释放这些锁。

Note

同步对象包含多个引用,包括对当前保存锁的线程的引用、对就绪队列的引用、包含准备获取锁的线程,以及对等待队列的引用,其中包含等待通知对象状态更改的线程。

必须在同步的代码块内调用PulsePulseAllWait方法。

对于 Pulse 方法的注释解释了如果在没有线程等待时调用 Pulse 会发生什么。

另请参阅

适用于

Wait(Object, TimeSpan, Boolean)

Source:
Monitor.cs
Source:
Monitor.cs
Source:
Monitor.cs
Source:
Monitor.cs
Source:
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

表示 TimeSpan 线程进入就绪队列之前等待的时间量。

exitContext
Boolean

true 如果处于同步上下文中,请在等待之前退出并重新获取上下文的同步域;否则,为 false.

返回

true 如果在指定时间过前重新获取锁, false 如果在指定时间过后重新获取锁。 在重新获取锁之前,该方法不会返回。

属性

例外

参数 objnull.

Wait 未从同步的代码块内调用。

调用 Wait 的线程稍后会从等待状态中断。 当另一个线程调用此线程 Interrupt() 的方法时,就会发生这种情况。

参数 timeout 为负值,不表示 Infinite (-1 毫秒),或大于 Int32.MaxValue

注解

有关此 API 的详细信息,请参阅 Monitor.Wait 的补充 API 备注

另请参阅

适用于