Monitor.Wait 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
释放对象上的锁并阻止当前线程,直到它重新获取该锁。
重载
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
发送 ,则所有正在等待对象的线程都会受到影响。 收到信号后,一个或多个线程离开等待队列并进入就绪队列。 允许就绪队列中的线程重新获取锁。
当调用线程重新获取对象上的锁时,此方法返回 。 请注意,如果锁的持有者不调用 Pulse
或 PulseAll
,此方法将无限期阻止。
调用方将执行 Wait
一次,而不考虑为指定对象调用的次数 Enter 。 从概念上讲, Wait
方法存储调用方在 对象上调用 Enter
的次数,并根据需要多次调用 Exit
以完全释放锁定的对象。 然后,调用方在等待重新获取对象时阻止。 当调用方重新获取锁时,系统会根据需要调用 Enter
任意次数来还原调用方保存 Enter
的计数。 调用 Wait
仅释放指定对象的锁;如果调用方是其他对象的锁的所有者,则不会释放这些锁。
请注意,同步对象包含多个引用,包括对当前持有锁的线程的引用、对就绪队列的引用(包含准备获取锁的线程)和对等待队列的引用,后者包含正在等待通知对象状态更改的线程。
Pulse必须在同步的代码块中调用 、 PulseAll和 Wait
方法。
方法的 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
独占锁之前不会返回。
当前在指定对象上拥有锁的线程调用此方法,以便释放对象,以便另一个线程可以访问它。 调用方在等待重新获取锁时被阻止。 当调用方需要等待由于另一个线程的操作而发生的状态更改时,将调用此方法。
如果另一个线程在不首先调用 Pulse 或 PulseAll 方法的情况下释放锁,则超时可确保当前线程不会无限期阻塞。 它还会将线程移动到就绪队列,绕过等待队列中之前的其他线程,以便可以更快地重新获取锁。 线程可以测试 方法的 Wait 返回值,以确定它是否在超时之前重新获取了锁。线程可以评估导致其进入等待的条件,并在必要时再次调用 Wait 方法。
当线程调用 Wait
时,它会释放对象的锁,并进入对象的等待队列。 对象的就绪队列中的下一个线程 (如果有一个) 获取锁并独占使用该对象。 调用 Wait
的线程将保留在等待队列中,直到包含锁的线程调用 PulseAll,或者它是队列中的下一个线程,而持有锁的线程调用 Pulse。 但是,如果 millisecondsTimeout
在另一个线程调用此对象的 Pulse 或 PulseAll 方法之前经过,则原始线程将移动到就绪队列以重新获得锁。
注意
如果 Infinite 为 millisecondsTimeout
参数指定了 ,则除非锁的持有者调用 Pulse 或 PulseAll,否则此方法将无限期阻止。 如果 millisecondsTimeout
等于 0,则调用 Wait
的线程释放锁,然后立即进入就绪队列以重新获取锁。
调用方将执行 Wait
一次,而不考虑为指定对象调用的次数 Enter 。 从概念上讲, Wait
方法存储调用方在 对象上调用 Enter 的次数,并根据需要多次调用 Exit 以完全释放锁定的对象。 然后,调用方在等待重新获取对象时阻止。 当调用方重新获取锁时,系统会根据需要调用 Enter 任意次数来还原调用方保存 Enter 的计数。 调用 Wait
仅释放指定对象的锁;如果调用方是其他对象的锁的所有者,则不会释放这些锁。
注意
同步对象包含多个引用,包括对当前持有锁的线程的引用、对就绪队列的引用(包含已准备好获取锁的线程)和对等待队列的引用,后者包含正在等待对象状态更改通知的线程。
Pulse必须在同步的代码块中调用 、 PulseAll和 Wait
方法。
方法的 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
要在其上等待的对象。
返回
如果在指定的时间过期之前重新获取该锁,则为 true
;如果在指定的时间过期之后重新获取该锁,则为 false
。 此方法只有在重新获取该锁后才会返回。
- 属性
例外
obj
参数为 null
。
调用线程不拥有指定对象的锁。
调用 Wait
的线程稍后从等待状态中断。 另一线程调用此线程的 Interrupt() 方法时将发生这种情况。
参数的值 timeout
(以毫秒为单位)为负值,不表示 Infinite) (-1 毫秒,也不表示大于 Int32.MaxValue。
注解
此方法在重新获取参数的 obj
排他锁之前不会返回。
当前在指定对象上拥有锁的线程调用此方法,以便释放对象,以便另一个线程可以访问它。 调用方在等待重新获取锁时被阻止。 当调用方需要等待由于另一个线程的操作而发生的状态更改时,将调用此方法。
如果另一个线程在不首先调用 Pulse 或 PulseAll 方法的情况下释放锁,则超时可确保当前线程不会无限期阻塞。 它还会将线程移动到就绪队列,绕过等待队列中之前的其他线程,以便它可以更快地重新获取锁。 线程可以测试方法的 Wait 返回值,以确定在超时之前是否重新获取了锁。线程可以评估导致其进入等待的条件,并在必要时再次调用 Wait 方法。
当线程调用 Wait
时,它会释放对象上的锁并进入对象的等待队列。 对象的就绪队列中的下一个线程 (如果有一个) 获取锁并独占使用该对象。 调用 Wait
的线程保留在等待队列中,直到持有锁的线程调用 PulseAll,或者它是队列中的下一个线程,而持有锁的线程调用 Pulse。 但是,如果 timeout
在另一个线程调用此对象的 Pulse 或 PulseAll 方法之前经过,则原始线程将移动到就绪队列以重新获得锁。
注意
TimeSpan如果为 timeout
参数指定了表示 -1 毫秒的 ,则此方法将无限期阻止,除非锁持有者调用 Pulse 或 PulseAll。 如果 timeout
为 0 毫秒,则调用 Wait
的线程将释放锁,然后立即进入就绪队列以重新获得锁。
调用方执行 Wait
一次,而不考虑为指定对象调用的次数 Enter 。 从概念上讲, Wait
方法存储调用方对 对象调用 Enter 的次数,并根据需要多次调用 Exit 以完全释放锁定的对象。 然后,调用方在等待重新获取对象时阻止。 当调用方重新获取锁时,系统会根据需要调用 Enter 任意次数来还原调用方保存 Enter 的计数。 调用 Wait
仅释放指定对象的锁;如果调用方是其他对象的锁的所有者,则不会释放这些锁。
注意
同步对象包含多个引用,包括对当前持有锁的线程的引用、对就绪队列的引用(包含准备获取锁的线程)和对等待队列的引用,该队列包含正在等待对象状态更改通知的线程。
Pulse必须在同步的代码块中调用 、 PulseAll和 Wait
方法。
方法的 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
要在其上等待的对象。
- exitContext
- Boolean
如果在等待前退出并重新获取上下文的同步域(如果在同步上下文中),则为 true
;否则为 false
。
返回
如果在指定的时间过期之前重新获取该锁,则为 true
;如果在指定的时间过期之后重新获取该锁,则为 false
。 此方法只有在重新获取该锁后才会返回。
- 属性
例外
obj
参数为 null
。
Wait
不是从同步的代码块中调用的。
调用 Wait 的线程稍后会从等待状态中中断。 另一线程调用此线程的 Interrupt() 方法时将发生这种情况。
参数 timeout
为负数,不表示 Infinite) (-1 毫秒,或大于 Int32.MaxValue。
注解
有关此 API 的详细信息,请参阅 Monitor.Wait 的补充 API 备注。