Поделиться через


Методы System.Threading.Monitor.Wait

В этой статье приводятся дополнительные замечания к справочной документации по этому API.

Wait(Object, Int32, Boolean)Метод

Этот метод не возвращается, пока он не будет повторно запрашивать монопольную блокировку параметра 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 освобождает блокировку только для указанного объекта. Если вызывающий объект является владельцем блокировок на других объектах, эти блокировки не освобождаются.

Примечание.

Синхронизированный объект содержит несколько ссылок, включая ссылку на поток, содержащий блокировку, ссылку на готовую очередь, содержащую потоки, готовые к получению блокировки, и ссылку на очередь ожидания, которая содержит потоки, ожидающие уведомления об изменении состояния объекта.

PulseAllМетоды Pulseи Wait методы должны вызываться из синхронизированного блока кода.

Примечания Pulse для метода объясняют, что происходит, если вызывается, когда Pulse потоки не ожидают.

Wait(Object, TimeSpan, Boolean)Метод

Этот метод не возвращается, пока он не будет повторно запрашивать монопольную блокировку параметра obj .

Поток, который в настоящее время владеет блокировкой указанного объекта, вызывает этот метод, чтобы освободить объект, чтобы другой поток смог получить к нему доступ. Вызывающий объект заблокирован во время ожидания повторного получения блокировки. Этот метод вызывается, когда вызывающий объект должен ожидать изменения состояния, которое произойдет в результате операций другого потока.

Время ожидания гарантирует, что текущий поток не блокируется на неопределенный срок, если другой поток освобождает блокировку без первого вызова Pulse или PulseAll метода. Он также перемещает поток в готовую очередь, обходя другие потоки впереди его в очереди ожидания, чтобы он смог повторно получить блокировку раньше. Поток может проверить возвращаемое значение Wait метода, чтобы определить, запрашивается ли блокировка до истечения времени ожидания. Поток может оценить условия, которые заставили его ввести ожидание, и при необходимости снова вызвать Wait метод.

При вызове Waitпотока он освобождает блокировку и вводит очередь ожидания. На этом этапе следующий поток в готовой очереди (если есть один) разрешено контролировать блокировку. Вызываемый Wait поток остается в очереди ожидания до тех пор, пока поток, содержащий вызов PulseAllблокировки, или следующий в очереди и поток, содержащий вызов Pulseблокировки. Однако если timeout миллисекунда истекает, прежде чем другой поток вызывает этот объект Pulse или PulseAll метод, исходный поток перемещается в готовую очередь, чтобы восстановить блокировку.

Примечание.

Если для параметра задано TimeSpan значение -1 миллисекунда, этот метод блокируется на неопределенный срок, если только владелец вызовов Pulse блокировки или PulseAll.timeout Если timeout значение равно 0 миллисекундам, поток, который вызывает Wait блокировку, а затем немедленно вводит готовую очередь, чтобы восстановить блокировку.

Вызывающий объект выполняется Wait один раз, независимо от количества вызовов Enter для указанного объекта. Концептуально Wait метод сохраняет количество вызовов вызываемого объекта Enter и вызывает Exit столько раз, сколько необходимо для полного освобождения заблокированного объекта. Затем вызывающий объект блокируется при ожидании повторного получения объекта. Когда вызывающий объект повторно запрашивает блокировку, система вызывает Enter столько раз, сколько необходимо для восстановления сохраненного Enter количества вызывающего абонента. Вызов Wait освобождает блокировку только для указанного объекта. Если вызывающий объект является владельцем блокировок на других объектах, эти блокировки не освобождаются.

Примечание.

Синхронизированный объект содержит несколько ссылок, включая ссылку на поток, содержащий блокировку, ссылку на готовую очередь, содержащую потоки, готовые к получению блокировки, и ссылку на очередь ожидания, которая содержит потоки, ожидающие уведомления об изменении состояния объекта.

PulseAllМетоды Pulseи Wait методы должны вызываться из синхронизированного блока кода.

Примечания Pulse для метода объясняют, что происходит, если вызывается, когда Pulse потоки не ожидают.

Выход из контекста

ПараметрexitContext не действует, если Wait метод не вызывается изнутри недефакулируемый управляемый контекст. Это может произойти, если поток находится внутри вызова экземпляра класса, производного от ContextBoundObject. Даже если в настоящее время выполняется метод в классе, который не является производным от ContextBoundObject, например String, вы можете находиться в неразделаемом контексте, если ContextBoundObject он находится в стеке в текущем домене приложения.

При выполнении кода в контексте, отличном от недефакторного контекста, указывая true , что exitContext поток выходит из неразделаемого управляемого контекста (т. е. для перехода в контекст по умолчанию) перед выполнением Wait метода. Он возвращается в исходный недефаулный контекст после завершения вызова Wait метода.

Это может быть полезно, если класс с привязкой контекста SynchronizationAttribute применяет атрибут. В этом случае все вызовы к членам класса синхронизируются автоматически, а домен синхронизации — весь текст кода для класса. Если код в стеке вызовов члена вызывает Wait метод и указывает true для exitContextэтого, поток выходит из домена синхронизации, что позволяет потоку, блокированному при вызове любого члена объекта, продолжить. Wait Когда метод возвращается, поток, который сделал вызов, должен ждать повторного приема домена синхронизации.