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