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

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

public:
 static bool Wait(System::Object ^ obj, int millisecondsTimeout, bool exitContext);
public static bool Wait (object obj, int millisecondsTimeout, bool exitContext);
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public static bool Wait (object obj, int millisecondsTimeout, bool exitContext);
static member Wait : obj * int * bool -> bool
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
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)

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。 如果未重新获取该锁,则此方法不会返回。

属性

例外

obj 参数为 null

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

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

注解

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

当线程调用 Wait时,它会释放对象的锁,并进入对象的等待队列。 对象的就绪队列中的下一个线程 (如果有一个) 获取锁并独占使用该对象。 调用 Wait 的所有线程都保留在等待队列中,直到收到或 PulsePulseAll由锁所有者发送的信号。 如果 Pulse 发送 ,则仅影响等待队列头上的线程。 如果 PulseAll 发送 ,则所有正在等待对象的线程都会受到影响。 收到信号后,一个或多个线程离开等待队列并进入就绪队列。 允许就绪队列中的线程重新获取锁。

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

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

请注意,同步对象包含多个引用,包括对当前持有锁的线程的引用、对就绪队列的引用(包含准备获取锁的线程)和对等待队列的引用,后者包含正在等待通知对象状态更改的线程。

Pulse必须在同步的代码块中调用 、 PulseAllWait 方法。

方法的 Pulse 注释说明了在没有 Pulse 线程等待时调用 时会发生什么情况。

另请参阅

适用于

Wait(Object, Int32)

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。 此方法只有在重新获取该锁后才会返回。

属性

例外

obj 参数为 null

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

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

millisecondsTimeout 参数值为负且不等于 Infinite

注解

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

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

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

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

注意

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

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

注意

同步对象包含多个引用,包括对当前持有锁的线程的引用、对就绪队列的引用(包含已准备好获取锁的线程)和对等待队列的引用,后者包含正在等待对象状态更改通知的线程。

Pulse必须在同步的代码块中调用 、 PulseAllWait 方法。

方法的 Pulse 注释说明了在没有线程等待时调用 时 Pulse 会发生什么情况。

另请参阅

适用于

Wait(Object, TimeSpan)

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。 此方法只有在重新获取该锁后才会返回。

属性

例外

obj 参数为 null

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

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

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

注解

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

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

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

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

注意

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

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

注意

同步对象包含多个引用,包括对当前持有锁的线程的引用、对就绪队列的引用(包含准备获取锁的线程)和对等待队列的引用,该队列包含正在等待对象状态更改通知的线程。

Pulse必须在同步的代码块中调用 、 PulseAllWait 方法。

方法的 Pulse 注释说明了在没有线程等待时调用 时 Pulse 会发生什么情况。

另请参阅

适用于

Wait(Object, TimeSpan, Boolean)

Source:
Monitor.cs
Source:
Monitor.cs
Source:
Monitor.cs

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

public:
 static bool Wait(System::Object ^ obj, TimeSpan timeout, bool exitContext);
public static bool Wait (object obj, TimeSpan timeout, bool exitContext);
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public static bool Wait (object obj, TimeSpan timeout, bool exitContext);
static member Wait : obj * TimeSpan * bool -> bool
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
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。 此方法只有在重新获取该锁后才会返回。

属性

例外

obj 参数为 null

Wait 不是从同步的代码块中调用的。

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

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

注解

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

另请参阅

适用于