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


Monitor.Pulse(Object) Метод

Определение

Уведомляет поток в очереди готовности об изменении состояния объекта с блокировкой.

public:
 static void Pulse(System::Object ^ obj);
public static void Pulse (object obj);
static member Pulse : obj -> unit
Public Shared Sub Pulse (obj As Object)

Параметры

obj
Object

Объект, ожидаемый потоком.

Исключения

Параметр obj имеет значение null.

Вызывающий поток не владеет блокировкой для указанного объекта.

Комментарии

Только текущий владелец блокировки может сообщить об объекте ожидания с помощью Pulse.

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

Важно!

Класс Monitor не поддерживает состояние, указывающее, что Pulse метод был вызван. Таким образом, если вы вызываете Pulse , когда потоки не ожидают ожидания, следующий поток, вызывающий Wait блоки, как если бы Pulse никогда не вызывался. Если два потока используют Pulse и Wait для взаимодействия, это может привести к взаимоблокировке. Сравните это с поведением AutoResetEvent класса : если вы сигнализируете AutoResetEvent , вызывая его Set метод, и потоки не ожидают ожидания, объект остается в состоянии сигнала, AutoResetEvent пока поток не вызовет WaitOne, WaitAnyили WaitAll. Освобождает AutoResetEvent этот поток и возвращается в состояние без знака.

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

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

Чтобы сообщить нескольким потокам PulseAll , используйте метод .

Применяется к

См. также раздел