Monitor.Wait Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Освобождает блокировку объекта и блокирует текущий поток, пока он не будет повторно запрашивать блокировку.
Перегрузки
| Имя | Описание |
|---|---|
| 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в противном случае .
Возвращаемое значение
- Атрибуты
Исключения
Параметр obj имеет значение null.
Wait не вызывается из синхронизированного блока кода.
Вызывающий поток Wait позже прерывается из состояния ожидания. Это происходит, когда другой поток вызывает метод этого потока Interrupt() .
Значение millisecondsTimeout параметра является отрицательным и не равно Infinite.
Комментарии
Wait(Object, Int32, Boolean)Метод
Этот метод не возвращается, пока он не будет повторно запрашивать монопольную блокировку параметра 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 столько раз, сколько необходимо для восстановления сохраненного счётчика для вызывающего. Вызов Wait освобождает блокировку только для указанного объекта. Если вызывающий объект является владельцем блокировок на других объектах, эти блокировки не освобождаются.
Note
Синхронизированный объект содержит несколько ссылок, включая ссылку на поток, содержащий блокировку, ссылку на готовую очередь, содержащую потоки, готовые к получению блокировки, и ссылку на очередь ожидания, которая содержит потоки, ожидающие уведомления об изменении состояния объекта.
Методы Pulse, PulseAll и Wait должны вызываться из синхронизированного блока кода.
Примечания к методу Pulse объясняют, что происходит, если Pulse вызывается в то время, когда нет ожидающих потоков.
Wait(Object, TimeSpan, Boolean)Метод
Этот метод не возвращается, пока он не будет повторно запрашивать монопольную блокировку параметра obj .
Поток, который в настоящее время владеет блокировкой указанного объекта, вызывает этот метод, чтобы освободить объект, чтобы другой поток смог получить к нему доступ. Вызывающий объект заблокирован во время ожидания повторного получения блокировки. Этот метод вызывается, когда вызывающий объект должен ожидать изменения состояния, которое произойдет в результате операций другого потока.
Время ожидания гарантирует, что текущий поток не блокируется на неопределенный срок, если другой поток освобождает блокировку без первого вызова Pulse или PulseAll метода. Он также перемещает поток в готовую очередь, обходя другие потоки впереди его в очереди ожидания, чтобы он смог повторно получить блокировку раньше. Поток может проверить возвращаемое значение метода Wait, чтобы определить, восстановила ли блокировку до истечения времени ожидания. Поток может оценить условия, которые заставили его перейти в состояние ожидания, и при необходимости снова вызвать метод Wait.
Когда поток вызывает Wait, он освобождает блокировку и переходит в очередь ожидания. На этом этапе следующий поток в готовой очереди, если он есть, может получить контроль над блокировкой. Поток, вызвавший Wait, остаётся в очереди ожидания до тех пор, пока поток, владеющий блокировкой, не вызовет PulseAll, или если он следующий в очереди и поток, владеющий блокировкой, вызывает Pulse. Однако, если timeout миллисекунды истекают прежде, чем другой поток вызывает метод Pulse или метод PulseAll этого объекта, исходный поток перемещается в очередь готовности, чтобы вернуть блокировку.
Note
TimeSpan Если для параметра timeout указано представление -1 миллисекунды, этот метод блокируется на неопределенный срок, если только владелец блокировки не вызовет Pulse или PulseAll. Если timeout равно 0 миллисекундам, поток, который вызывает Wait и снимает блокировку, а затем немедленно перемещается в очередь на выполнение, чтобы снова захватить блокировку.
Вызывающая сторона выполняет Wait один раз, независимо от того, сколько раз был вызван Enter для указанного объекта. Концептуально Wait метод сохраняет количество вызовов вызываемого объекта Enter и вызывает Exit столько раз, сколько необходимо для полного освобождения заблокированного объекта. Затем вызывающий объект блокируется при ожидании повторного получения объекта. Когда вызывающий процесс повторно получает блокировку, система вызывает Enter столько раз, сколько необходимо для восстановления сохраненного счётчика для вызывающего. Вызов Wait освобождает блокировку только для указанного объекта. Если вызывающий объект является владельцем блокировок на других объектах, эти блокировки не освобождаются.
Note
Синхронизированный объект содержит несколько ссылок, включая ссылку на поток, содержащий блокировку, ссылку на готовую очередь, содержащую потоки, готовые к получению блокировки, и ссылку на очередь ожидания, которая содержит потоки, ожидающие уведомления об изменении состояния объекта.
Методы Pulse, PulseAll и Wait должны вызываться из синхронизированного блока кода.
Примечания к методу Pulse объясняют, что происходит, если Pulse вызывается в то время, когда нет ожидающих потоков.
Выйти из контекста
Параметр exitContext не действует, если Wait метод не вызывается изнутри недефакулируемый управляемый контекст. Это может произойти, если ваш поток находится внутри вызова экземпляра класса, производного от ContextBoundObject. Даже если в настоящее время вы выполняете метод в классе, который не является производным от ContextBoundObject, как, например, String, вы можете находиться в контексте не по умолчанию, если ContextBoundObject находится в вашем стеке в текущем домене приложения.
При выполнении кода в контексте, отличном от контекста по умолчанию, указание true для exitContext вызывает выход потока из альтернативного управляемого контекста (то есть переход в контекст по умолчанию) перед выполнением метода Wait. Он возвращается в исходный недефаулный контекст после завершения вызова Wait метода.
Это может быть полезно, когда к классу с привязкой к контексту применяется атрибут SynchronizationAttribute. В этом случае все вызовы к членам класса синхронизируются автоматически, а домен синхронизации — весь текст кода для класса. Если код в стеке вызовов члена вызывает Wait метод и указывает true для exitContextэтого, поток выходит из домена синхронизации, что позволяет потоку, блокированному при вызове любого члена объекта, продолжить. Когда метод Wait возвращается, поток, который сделал вызов, должен ждать повторного вхождения в домен синхронизации.
См. также раздел
Применяется к
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
Объект, на котором нужно ждать.
Возвращаемое значение
- Атрибуты
Исключения
Параметр obj имеет значение null.
Вызывающий поток не владеет блокировкой указанного объекта.
Вызывающий поток Wait позже прерывается из состояния ожидания. Это происходит, когда другой поток вызывает метод этого потока Interrupt() .
Комментарии
Поток, который в настоящее время владеет блокировкой указанного объекта, вызывает этот метод, чтобы освободить объект, чтобы другой поток смог получить к нему доступ. Вызывающий объект заблокирован во время ожидания повторного получения блокировки. Этот метод вызывается, когда вызывающий объект должен ожидать изменения состояния, которое произойдет в результате операций другого потока.
При вызове Waitпотока он освобождает блокировку объекта и вводит очередь ожидания объекта. Следующий поток в очереди готовности объекта (если есть) получает блокировку и имеет монопольное использование объекта. Все потоки, вызывающие вызов Wait , остаются в очереди ожидания, пока они не получат сигнал от Pulse владельца блокировки или PulseAllотправляются владельцем блокировки. При Pulse отправке затрагивается только поток в голове очереди ожидания. При PulseAll отправке будут затронуты все потоки, ожидающие объекта. Когда сигнал получен, один или несколько потоков покидают очередь ожидания и введите готовую очередь. Поток в готовой очереди разрешается повторно запрашивать блокировку.
Этот метод возвращается, когда вызывающий поток повторно запрашивает блокировку объекта. Обратите внимание, что этот метод блокируется на неопределенный срок, если владелец блокировки не вызывает Pulse или PulseAll.
Вызывающая сторона выполняет Wait один раз, независимо от того, сколько раз был вызван Enter для указанного объекта. Концептуально Wait метод сохраняет количество вызовов вызываемого объекта Enter и вызывает Exit столько раз, сколько необходимо для полного освобождения заблокированного объекта. Затем вызывающий объект блокируется при ожидании повторного получения объекта. Когда вызывающий процесс повторно получает блокировку, система вызывает Enter столько раз, сколько необходимо для восстановления сохраненного счётчика для вызывающего. Вызов Wait освобождает блокировку только для указанного объекта. Если вызывающий объект является владельцем блокировок на других объектах, эти блокировки не освобождаются.
Обратите внимание, что синхронизированный объект содержит несколько ссылок, включая ссылку на поток, содержащий блокировку, ссылку на готовую очередь, содержащую потоки, готовые к получению блокировки, и ссылку на очередь ожидания, которая содержит потоки, ожидающие уведомления об изменении состояния объекта.
Методы Pulse, PulseAll и Wait должны вызываться из синхронизированного блока кода.
Примечания к методу 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
Количество миллисекунда, ожидающего, прежде чем поток вошел в готовую очередь.
Возвращаемое значение
- Атрибуты
Исключения
Параметр 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 столько раз, сколько необходимо для восстановления сохраненного счётчика для вызывающего. Вызов Wait освобождает блокировку только для указанного объекта. Если вызывающий объект является владельцем блокировок на других объектах, эти блокировки не освобождаются.
Note
Синхронизированный объект содержит несколько ссылок, включая ссылку на поток, содержащий блокировку, ссылку на готовую очередь, содержащую потоки, готовые к получению блокировки, и ссылку на очередь ожидания, которая содержит потоки, ожидающие уведомления об изменении состояния объекта.
Методы Pulse, PulseAll и Wait должны вызываться из синхронизированного блока кода.
Примечания к методу 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
Значение TimeSpan , представляющее время ожидания, прежде чем поток вошел в готовую очередь.
Возвращаемое значение
- Атрибуты
Исключения
Параметр obj имеет значение null.
Вызывающий поток не владеет блокировкой указанного объекта.
Вызывающий поток Wait позже прерывается из состояния ожидания. Это происходит, когда другой поток вызывает метод этого потока Interrupt() .
Значение timeout параметра в миллисекундах отрицательное и не представляет Infinite (-1 миллисекунда) или больше Int32.MaxValue.
Комментарии
Этот метод не возвращается, пока он не будет повторно запрашивать монопольную блокировку параметра obj .
Поток, который в настоящее время владеет блокировкой указанного объекта, вызывает этот метод, чтобы освободить объект, чтобы другой поток смог получить к нему доступ. Вызывающий объект заблокирован во время ожидания повторного получения блокировки. Этот метод вызывается, когда вызывающий объект должен ожидать изменения состояния, которое произойдет в результате операций другого потока.
Время ожидания гарантирует, что текущий поток не блокируется на неопределенный срок, если другой поток освобождает блокировку без первого вызова Pulse или PulseAll метода. Он также перемещает поток в готовую очередь, обходя другие потоки впереди его в очереди ожидания, чтобы он смог повторно получить блокировку раньше. Поток может проверить возвращаемое значение метода Wait, чтобы определить, восстановила ли блокировку до истечения времени ожидания. Поток может оценить условия, которые заставили его перейти в состояние ожидания, и при необходимости снова вызвать метод Wait.
При вызове Waitпотока он освобождает блокировку объекта и вводит очередь ожидания объекта. Следующий поток в очереди готовности объекта (если есть) получает блокировку и имеет монопольное использование объекта. Поток, вызвавший Wait, остаётся в очереди ожидания до тех пор, пока поток, владеющий блокировкой, не вызовет PulseAll, или если он следующий в очереди и поток, владеющий блокировкой, вызывает Pulse. Тем не менее, если timeout истекает, прежде чем другой поток вызовет метод Pulse или метод PulseAll этого объекта, исходный поток перемещается в готовую очередь, чтобы снова захватить блокировку.
Note
TimeSpan Если для параметра timeout указано представление -1 миллисекунды, этот метод блокируется на неопределенный срок, если только владелец блокировки не вызовет Pulse или PulseAll. Если timeout равно 0 миллисекундам, поток, который вызывает Wait и снимает блокировку, а затем немедленно перемещается в очередь на выполнение, чтобы снова захватить блокировку.
Вызывающая сторона выполняет Wait один раз, независимо от того, сколько раз был вызван Enter для указанного объекта. Концептуально Wait метод сохраняет количество вызовов вызываемого объекта Enter и вызывает Exit столько раз, сколько необходимо для полного освобождения заблокированного объекта. Затем вызывающий объект блокируется при ожидании повторного получения объекта. Когда вызывающий процесс повторно получает блокировку, система вызывает Enter столько раз, сколько необходимо для восстановления сохраненного счётчика для вызывающего. Вызов Wait освобождает блокировку только для указанного объекта. Если вызывающий объект является владельцем блокировок на других объектах, эти блокировки не освобождаются.
Note
Синхронизированный объект содержит несколько ссылок, включая ссылку на поток, содержащий блокировку, ссылку на готовую очередь, содержащую потоки, готовые к получению блокировки, и ссылку на очередь ожидания, которая содержит потоки, ожидающие уведомления об изменении состояния объекта.
Методы Pulse, PulseAll и Wait должны вызываться из синхронизированного блока кода.
Примечания к методу 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
Значение TimeSpan , представляющее время ожидания, прежде чем поток вошел в готовую очередь.
- exitContext
- Boolean
true для выхода и повторного получения домена синхронизации для контекста (если в синхронизированном контексте) перед ожиданием; falseв противном случае .
Возвращаемое значение
- Атрибуты
Исключения
Параметр obj имеет значение null.
Wait не вызывается из синхронизированного блока кода.
Поток, вызывающий wait, позже прерывается из состояния ожидания. Это происходит, когда другой поток вызывает метод этого потока Interrupt() .
Параметр timeout отрицательный и не представляет Infinite (-1 миллисекунда) или больше Int32.MaxValue.
Комментарии
Wait(Object, Int32, Boolean)Метод
Этот метод не возвращается, пока он не будет повторно запрашивать монопольную блокировку параметра 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 столько раз, сколько необходимо для восстановления сохраненного счётчика для вызывающего. Вызов Wait освобождает блокировку только для указанного объекта. Если вызывающий объект является владельцем блокировок на других объектах, эти блокировки не освобождаются.
Note
Синхронизированный объект содержит несколько ссылок, включая ссылку на поток, содержащий блокировку, ссылку на готовую очередь, содержащую потоки, готовые к получению блокировки, и ссылку на очередь ожидания, которая содержит потоки, ожидающие уведомления об изменении состояния объекта.
Методы Pulse, PulseAll и Wait должны вызываться из синхронизированного блока кода.
Примечания к методу Pulse объясняют, что происходит, если Pulse вызывается в то время, когда нет ожидающих потоков.
Wait(Object, TimeSpan, Boolean)Метод
Этот метод не возвращается, пока он не будет повторно запрашивать монопольную блокировку параметра obj .
Поток, который в настоящее время владеет блокировкой указанного объекта, вызывает этот метод, чтобы освободить объект, чтобы другой поток смог получить к нему доступ. Вызывающий объект заблокирован во время ожидания повторного получения блокировки. Этот метод вызывается, когда вызывающий объект должен ожидать изменения состояния, которое произойдет в результате операций другого потока.
Время ожидания гарантирует, что текущий поток не блокируется на неопределенный срок, если другой поток освобождает блокировку без первого вызова Pulse или PulseAll метода. Он также перемещает поток в готовую очередь, обходя другие потоки впереди его в очереди ожидания, чтобы он смог повторно получить блокировку раньше. Поток может проверить возвращаемое значение метода Wait, чтобы определить, восстановила ли блокировку до истечения времени ожидания. Поток может оценить условия, которые заставили его перейти в состояние ожидания, и при необходимости снова вызвать метод Wait.
Когда поток вызывает Wait, он освобождает блокировку и переходит в очередь ожидания. На этом этапе следующий поток в готовой очереди, если он есть, может получить контроль над блокировкой. Поток, вызвавший Wait, остаётся в очереди ожидания до тех пор, пока поток, владеющий блокировкой, не вызовет PulseAll, или если он следующий в очереди и поток, владеющий блокировкой, вызывает Pulse. Однако, если timeout миллисекунды истекают прежде, чем другой поток вызывает метод Pulse или метод PulseAll этого объекта, исходный поток перемещается в очередь готовности, чтобы вернуть блокировку.
Note
TimeSpan Если для параметра timeout указано представление -1 миллисекунды, этот метод блокируется на неопределенный срок, если только владелец блокировки не вызовет Pulse или PulseAll. Если timeout равно 0 миллисекундам, поток, который вызывает Wait и снимает блокировку, а затем немедленно перемещается в очередь на выполнение, чтобы снова захватить блокировку.
Вызывающая сторона выполняет Wait один раз, независимо от того, сколько раз был вызван Enter для указанного объекта. Концептуально Wait метод сохраняет количество вызовов вызываемого объекта Enter и вызывает Exit столько раз, сколько необходимо для полного освобождения заблокированного объекта. Затем вызывающий объект блокируется при ожидании повторного получения объекта. Когда вызывающий процесс повторно получает блокировку, система вызывает Enter столько раз, сколько необходимо для восстановления сохраненного счётчика для вызывающего. Вызов Wait освобождает блокировку только для указанного объекта. Если вызывающий объект является владельцем блокировок на других объектах, эти блокировки не освобождаются.
Note
Синхронизированный объект содержит несколько ссылок, включая ссылку на поток, содержащий блокировку, ссылку на готовую очередь, содержащую потоки, готовые к получению блокировки, и ссылку на очередь ожидания, которая содержит потоки, ожидающие уведомления об изменении состояния объекта.
Методы Pulse, PulseAll и Wait должны вызываться из синхронизированного блока кода.
Примечания к методу Pulse объясняют, что происходит, если Pulse вызывается в то время, когда нет ожидающих потоков.
Выйти из контекста
Параметр exitContext не действует, если Wait метод не вызывается изнутри недефакулируемый управляемый контекст. Это может произойти, если ваш поток находится внутри вызова экземпляра класса, производного от ContextBoundObject. Даже если в настоящее время вы выполняете метод в классе, который не является производным от ContextBoundObject, как, например, String, вы можете находиться в контексте не по умолчанию, если ContextBoundObject находится в вашем стеке в текущем домене приложения.
При выполнении кода в контексте, отличном от контекста по умолчанию, указание true для exitContext вызывает выход потока из альтернативного управляемого контекста (то есть переход в контекст по умолчанию) перед выполнением метода Wait. Он возвращается в исходный недефаулный контекст после завершения вызова Wait метода.
Это может быть полезно, когда к классу с привязкой к контексту применяется атрибут SynchronizationAttribute. В этом случае все вызовы к членам класса синхронизируются автоматически, а домен синхронизации — весь текст кода для класса. Если код в стеке вызовов члена вызывает Wait метод и указывает true для exitContextэтого, поток выходит из домена синхронизации, что позволяет потоку, блокированному при вызове любого члена объекта, продолжить. Когда метод Wait возвращается, поток, который сделал вызов, должен ждать повторного вхождения в домен синхронизации.