Monitor.Pulse(Object) Methode

Definition

Benachrichtigt einen Thread in der Warteschlange für abzuarbeitende Threads über eine Änderung am Zustand des gesperrten Objekts.Notifies a thread in the waiting queue of a change in the locked object's state.

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)

Parameter

obj
Object

Das Objekt, auf das ein Thread wartet.The object a thread is waiting for.

Ausnahmen

Der obj-Parameter ist null.The obj parameter is null.

Der aufrufende Thread besitzt keine Sperre für das angegebene Objekt.The calling thread does not own the lock for the specified object.

Hinweise

Nur der aktuelle Besitzer der Sperre kann ein wartender Objekt mithilfe Pulsevon signalisieren.Only the current owner of the lock can signal a waiting object using Pulse.

Der Thread, der die Sperre für das angegebene Objekt zurzeit besitzt, ruft diese Methode auf, um den nächsten Thread in der Zeile für die Sperre zu signalisieren.The thread that currently owns the lock on the specified object invokes this method to signal the next thread in line for the lock. Beim Empfang des Pulse wird der wartende Thread in die bereite Warteschlange verschoben.Upon receiving the pulse, the waiting thread is moved to the ready queue. Wenn der Thread, der Pulse die Sperre aufgerufen hat, die Sperre freigibt, erhält der nächste Thread in der Warteschlange (der nicht unbedingt der Thread ist, der gepultet wurde) die Sperre.When the thread that invoked Pulse releases the lock, the next thread in the ready queue (which is not necessarily the thread that was pulsed) acquires the lock.

Wichtig

Die Monitor -Klasse behält den Zustand nicht bei, Pulse der angibt, dass die-Methode aufgerufen wurde.The Monitor class does not maintain state indicating that the Pulse method has been called. Wenn Sie also aufrufen Pulse , wenn keine Threads warten, wird der nächste Thread, der Blöcke aufruft Wait , Pulse als, wenn nie aufgerufen wurde, aufgerufen.Thus, if you call Pulse when no threads are waiting, the next thread that calls Wait blocks as if Pulse had never been called. Wenn zwei Threads und Pulse Wait für die Interaktion verwenden, könnte dies zu einem Deadlock führen.If two threads are using Pulse and Wait to interact, this could result in a deadlock. Vergleichen Sie dies mit dem Verhalten AutoResetEvent der-Klasse: Wenn Sie AutoResetEvent ein signalisieren, indem Sie Set die zugehörige-Methode aufrufen und keine Threads warten AutoResetEvent , verbleibt der in einem signalisierten Zustand, WaitAnybis ein WaitAllThread, oder aufruft WaitOne.Contrast this with the behavior of the AutoResetEvent class: If you signal an AutoResetEvent by calling its Set method, and there are no threads waiting, the AutoResetEvent remains in a signaled state until a thread calls WaitOne, WaitAny, or WaitAll. Der AutoResetEvent gibt diesen Thread frei und kehrt in den nicht signalisierten Zustand zurück.The AutoResetEvent releases that thread and returns to the unsignaled state.

Beachten Sie, dass ein synchronisiertes Objekt mehrere Verweise enthält, einschließlich eines Verweises auf den Thread, der derzeit die Sperre besitzt, einen Verweis auf die bereite Warteschlange, die die Threads enthält, die zum Abrufen der Sperre bereit sind, sowie einen Verweis auf die Warteschlange, die enthält die Threads, die auf die Benachrichtigung über eine Änderung des Objekt Zustands warten.Note that a synchronized object holds several references, including a reference to the thread that currently holds the lock, a reference to the ready queue, which contains the threads that are ready to obtain the lock, and a reference to the waiting queue, which contains the threads that are waiting for notification of a change in the object's state.

Die PulseMethoden PulseAll, undWait müssen in einem synchronisierten Codeblock aufgerufen werden.The Pulse, PulseAll, and Wait methods must be invoked from within a synchronized block of code.

Verwenden Sie die PulseAll -Methode, um mehrere Threads zu signalisieren.To signal multiple threads, use the PulseAll method.

Gilt für:

Siehe auch