EventWaitHandle Klasse

Definition

Stellt ein Threadsynchronisierungsereignis dar.

public ref class EventWaitHandle : System::Threading::WaitHandle
public class EventWaitHandle : System.Threading.WaitHandle
[System.Runtime.InteropServices.ComVisible(true)]
public class EventWaitHandle : System.Threading.WaitHandle
type EventWaitHandle = class
    inherit WaitHandle
[<System.Runtime.InteropServices.ComVisible(true)>]
type EventWaitHandle = class
    inherit WaitHandle
Public Class EventWaitHandle
Inherits WaitHandle
Vererbung
EventWaitHandle
Vererbung
Abgeleitet
Attribute

Beispiele

Im folgenden Codebeispiel wird die SignalAndWait(WaitHandle, WaitHandle) Methodenüberladung verwendet, um dem Hauptthread das Signal eines blockierten Threads zu ermöglichen und dann zu warten, bis der Thread eine Aufgabe beendet hat.

Das Beispiel startet fünf Threads und ermöglicht es ihnen, für ein EventWaitHandle erstelltes Element mit der EventResetMode.AutoReset Kennzeichnung zu blockieren, und gibt dann jedes Mal, wenn der Benutzer die EINGABETASTE drückt, einen Thread los. Im Beispiel werden dann weitere fünf Threads in die Warteschlange gestellt und alle mit der EventWaitHandleEventResetMode.ManualReset Kennzeichnung erstellt.

using System;
using System.Threading;

public class Example
{
    // The EventWaitHandle used to demonstrate the difference
    // between AutoReset and ManualReset synchronization events.
    //
    private static EventWaitHandle ewh;

    // A counter to make sure all threads are started and
    // blocked before any are released. A Long is used to show
    // the use of the 64-bit Interlocked methods.
    //
    private static long threadCount = 0;

    // An AutoReset event that allows the main thread to block
    // until an exiting thread has decremented the count.
    //
    private static EventWaitHandle clearCount = 
        new EventWaitHandle(false, EventResetMode.AutoReset);

    [MTAThread]
    public static void Main()
    {
        // Create an AutoReset EventWaitHandle.
        //
        ewh = new EventWaitHandle(false, EventResetMode.AutoReset);

        // Create and start five numbered threads. Use the
        // ParameterizedThreadStart delegate, so the thread
        // number can be passed as an argument to the Start 
        // method.
        for (int i = 0; i <= 4; i++)
        {
            Thread t = new Thread(
                new ParameterizedThreadStart(ThreadProc)
            );
            t.Start(i);
        }

        // Wait until all the threads have started and blocked.
        // When multiple threads use a 64-bit value on a 32-bit
        // system, you must access the value through the
        // Interlocked class to guarantee thread safety.
        //
        while (Interlocked.Read(ref threadCount) < 5)
        {
            Thread.Sleep(500);
        }

        // Release one thread each time the user presses ENTER,
        // until all threads have been released.
        //
        while (Interlocked.Read(ref threadCount) > 0)
        {
            Console.WriteLine("Press ENTER to release a waiting thread.");
            Console.ReadLine();

            // SignalAndWait signals the EventWaitHandle, which
            // releases exactly one thread before resetting, 
            // because it was created with AutoReset mode. 
            // SignalAndWait then blocks on clearCount, to 
            // allow the signaled thread to decrement the count
            // before looping again.
            //
            WaitHandle.SignalAndWait(ewh, clearCount);
        }
        Console.WriteLine();

        // Create a ManualReset EventWaitHandle.
        //
        ewh = new EventWaitHandle(false, EventResetMode.ManualReset);

        // Create and start five more numbered threads.
        //
        for(int i=0; i<=4; i++)
        {
            Thread t = new Thread(
                new ParameterizedThreadStart(ThreadProc)
            );
            t.Start(i);
        }

        // Wait until all the threads have started and blocked.
        //
        while (Interlocked.Read(ref threadCount) < 5)
        {
            Thread.Sleep(500);
        }

        // Because the EventWaitHandle was created with
        // ManualReset mode, signaling it releases all the
        // waiting threads.
        //
        Console.WriteLine("Press ENTER to release the waiting threads.");
        Console.ReadLine();
        ewh.Set();
    }

    public static void ThreadProc(object data)
    {
        int index = (int) data;

        Console.WriteLine("Thread {0} blocks.", data);
        // Increment the count of blocked threads.
        Interlocked.Increment(ref threadCount);

        // Wait on the EventWaitHandle.
        ewh.WaitOne();

        Console.WriteLine("Thread {0} exits.", data);
        // Decrement the count of blocked threads.
        Interlocked.Decrement(ref threadCount);

        // After signaling ewh, the main thread blocks on
        // clearCount until the signaled thread has 
        // decremented the count. Signal it now.
        //
        clearCount.Set();
    }
}
Imports System.Threading

Public Class Example

    ' The EventWaitHandle used to demonstrate the difference
    ' between AutoReset and ManualReset synchronization events.
    '
    Private Shared ewh As EventWaitHandle

    ' A counter to make sure all threads are started and
    ' blocked before any are released. A Long is used to show
    ' the use of the 64-bit Interlocked methods.
    '
    Private Shared threadCount As Long = 0

    ' An AutoReset event that allows the main thread to block
    ' until an exiting thread has decremented the count.
    '
    Private Shared clearCount As New EventWaitHandle(False, _
        EventResetMode.AutoReset)

    <MTAThread> _
    Public Shared Sub Main()

        ' Create an AutoReset EventWaitHandle.
        '
        ewh = New EventWaitHandle(False, EventResetMode.AutoReset)

        ' Create and start five numbered threads. Use the
        ' ParameterizedThreadStart delegate, so the thread
        ' number can be passed as an argument to the Start 
        ' method.
        For i As Integer = 0 To 4
            Dim t As New Thread(AddressOf ThreadProc)
            t.Start(i)
        Next i

        ' Wait until all the threads have started and blocked.
        ' When multiple threads use a 64-bit value on a 32-bit
        ' system, you must access the value through the
        ' Interlocked class to guarantee thread safety.
        '
        While Interlocked.Read(threadCount) < 5
            Thread.Sleep(500)
        End While

        ' Release one thread each time the user presses ENTER,
        ' until all threads have been released.
        '
        While Interlocked.Read(threadCount) > 0
            Console.WriteLine("Press ENTER to release a waiting thread.")
            Console.ReadLine()

            ' SignalAndWait signals the EventWaitHandle, which
            ' releases exactly one thread before resetting, 
            ' because it was created with AutoReset mode. 
            ' SignalAndWait then blocks on clearCount, to 
            ' allow the signaled thread to decrement the count
            ' before looping again.
            '
            WaitHandle.SignalAndWait(ewh, clearCount)
        End While
        Console.WriteLine()

        ' Create a ManualReset EventWaitHandle.
        '
        ewh = New EventWaitHandle(False, EventResetMode.ManualReset)

        ' Create and start five more numbered threads.
        '
        For i As Integer = 0 To 4
            Dim t As New Thread(AddressOf ThreadProc)
            t.Start(i)
        Next i

        ' Wait until all the threads have started and blocked.
        '
        While Interlocked.Read(threadCount) < 5
            Thread.Sleep(500)
        End While

        ' Because the EventWaitHandle was created with
        ' ManualReset mode, signaling it releases all the
        ' waiting threads.
        '
        Console.WriteLine("Press ENTER to release the waiting threads.")
        Console.ReadLine()
        ewh.Set()
        
    End Sub

    Public Shared Sub ThreadProc(ByVal data As Object)
        Dim index As Integer = CInt(data)

        Console.WriteLine("Thread {0} blocks.", data)
        ' Increment the count of blocked threads.
        Interlocked.Increment(threadCount)

        ' Wait on the EventWaitHandle.
        ewh.WaitOne()

        Console.WriteLine("Thread {0} exits.", data)
        ' Decrement the count of blocked threads.
        Interlocked.Decrement(threadCount)

        ' After signaling ewh, the main thread blocks on
        ' clearCount until the signaled thread has 
        ' decremented the count. Signal it now.
        '
        clearCount.Set()
    End Sub
End Class

Hinweise

Die EventWaitHandle Klasse ermöglicht threads die Kommunikation miteinander durch Signalisierung. In der Regel wird mindestens ein Threads auf einem EventWaitHandle Thread blockiert, bis ein nicht blockierter Thread die Set Methode aufruft und mindestens einen der blockierten Threads freigibt. Ein Thread kann eine EventWaitHandle signalisieren und dann blockieren, indem die static (Shared in Visual Basic) WaitHandle.SignalAndWait-Methode aufgerufen wird.

Note

Die EventWaitHandle Klasse bietet Zugriff auf benannte Systemsynchronisierungsereignisse.

Das Verhalten eines signalisierten Elements EventWaitHandle hängt vom Zurücksetzungsmodus ab. Ein EventWaitHandle mit der EventResetMode.AutoReset Kennzeichnung erstelltes Element wird automatisch zurückgesetzt, wenn signalisiert wird, nachdem ein einzelner Wartethread freigegeben wurde. Eine mit der EventWaitHandle-Flag erstellte EventResetMode.ManualReset bleibt so lange ein Signal, bis die Reset-Methode aufgerufen wird.

Automatische Zurücksetzungsereignisse bieten exklusiven Zugriff auf eine Ressource. Wenn ein automatisches Reset-Ereignis signalisiert wird, wenn keine Threads warten, bleibt es signalisiert, bis ein Thread versucht, darauf zu warten. Das Ereignis gibt den Thread frei, setzt ihn sofort zurück und blockiert dabei nachfolgende Threads.

Manuelle Zurücksetzungsereignisse sind wie Tore. Wenn das Ereignis nicht signalisiert ist, werden Threads, die darauf warten, blockiert. Wenn das Ereignis signalisiert wird, werden alle Wartethreads freigegeben, und das Ereignis bleibt signalisiert (d. h. nachfolgende Wartezeiten blockieren nicht), bis die Reset Methode aufgerufen wird. Manuelle Zurücksetzungsereignisse sind nützlich, wenn ein Thread eine Aktivität abschließen muss, bevor andere Threads fortgesetzt werden können.

EventWaitHandle-Objekte können mit den Methoden static(Shared in Visual Basic) WaitHandle.WaitAll und WaitHandle.WaitAny verwendet werden.

Weitere Informationen finden Sie im Abschnitt "Threadinteraktion" oder "Signalisierung " des Artikels "Übersicht über Synchronisierungsgrundtypen" .

Vorsicht

Standardmäßig ist ein benanntes Ereignis nicht auf den Benutzer beschränkt, der es erstellt hat. Andere Benutzer können das Ereignis möglicherweise öffnen und verwenden, einschließlich der Störung des Ereignisses durch Festlegen oder Unangemessenes Zurücksetzen des Ereignisses. Um den Zugriff auf bestimmte Benutzer einzuschränken, können Sie eine Konstruktorüberladung verwenden oder EventWaitHandleAcl beim Erstellen des benannten Ereignisses übergeben und übergeben EventWaitHandleSecurity . Vermeiden Sie die Verwendung benannter Ereignisse ohne Zugriffsbeschränkungen für Systeme, die möglicherweise nicht vertrauenswürdige Benutzer haben, die Code ausführen.

Konstruktoren

Name Beschreibung
EventWaitHandle(Boolean, EventResetMode, String, Boolean, EventWaitHandleSecurity)

Initialisiert eine neue Instanz der EventWaitHandle Klasse, die angibt, ob das Wartekästchen anfänglich signalisiert wird, wenn es als Ergebnis dieses Aufrufs erstellt wird, unabhängig davon, ob es automatisch oder manuell zurückgesetzt wird, den Namen eines Systemsynchronisierungsereignisses, eine boolesche Variable, deren Wert nach dem Aufruf angibt, ob das benannte Systemereignis erstellt wurde, und die Zugriffssteuerungssicherheit, die auf das benannte Ereignis angewendet werden soll, wenn es erstellt wird.

EventWaitHandle(Boolean, EventResetMode, String, Boolean)

Initialisiert eine neue Instanz der EventWaitHandle Klasse, die angibt, ob das Wartekästchen anfänglich signalisiert wird, wenn es als Ergebnis dieses Aufrufs erstellt wird, unabhängig davon, ob es automatisch oder manuell zurückgesetzt wird, den Namen eines Systemsynchronisierungsereignisses und eine boolesche Variable, deren Wert nach dem Aufruf angibt, ob das benannte Systemereignis erstellt wurde.

EventWaitHandle(Boolean, EventResetMode, String, NamedWaitHandleOptions, Boolean)

Initialisiert eine neue Instanz der EventWaitHandle Klasse, die angibt, ob das Wartekästchen anfänglich signalisiert wird, wenn es als Ergebnis dieses Aufrufs erstellt wird, unabhängig davon, ob es automatisch oder manuell zurückgesetzt wird, den Namen eines Systemsynchronisierungsereignisses, Optionen zum Festlegen des Benutzerbereichs- und Sitzungsbereichszugriffs sowie eine boolesche Variable, deren Wert nach dem Aufruf angibt, ob das benannte Systemereignis erstellt wurde.

EventWaitHandle(Boolean, EventResetMode, String, NamedWaitHandleOptions)

Initialisiert eine neue Instanz der EventWaitHandle Klasse, die angibt, ob das Wartehandle anfänglich signalisiert wird, wenn sie als Ergebnis dieses Aufrufs erstellt wird, unabhängig davon, ob sie automatisch oder manuell zurückgesetzt wird, den Namen eines Systemsynchronisierungsereignisses sowie Optionen zum Festlegen des Benutzerbereichs und des Sitzungsbereichszugriffs.

EventWaitHandle(Boolean, EventResetMode, String)

Initialisiert eine neue Instanz der EventWaitHandle Klasse, die angibt, ob das Wartekästchen anfänglich signalisiert wird, wenn es als Ergebnis dieses Aufrufs erstellt wird, ob sie automatisch oder manuell zurückgesetzt wird, und den Namen eines Systemsynchronisierungsereignisses.

EventWaitHandle(Boolean, EventResetMode)

Initialisiert eine neue Instanz der EventWaitHandle Klasse, die angibt, ob das Wartekästchen anfangs signalisiert wird und ob es automatisch oder manuell zurückgesetzt wird.

Felder

Name Beschreibung
WaitTimeout

Gibt an, dass ein WaitAny(WaitHandle[], Int32, Boolean) Vorgang überschritten wurde, bevor ein Wartepunkt signalisiert wurde. Dieses Feld ist konstant.

(Geerbt von WaitHandle)

Eigenschaften

Name Beschreibung
Handle
Veraltet.
Veraltet.

Dient zum Abrufen oder Festlegen des systemeigenen Betriebssystemhandles.

(Geerbt von WaitHandle)
SafeWaitHandle

Dient zum Abrufen oder Festlegen des systemeigenen Betriebssystemhandles.

(Geerbt von WaitHandle)

Methoden

Name Beschreibung
Close()

Veröffentlicht alle Ressourcen, die von der aktuellen WaitHandle.

(Geerbt von WaitHandle)
CreateObjRef(Type)

Erstellt ein Objekt, das alle relevanten Informationen enthält, die zum Generieren eines Proxys erforderlich sind, der für die Kommunikation mit einem Remoteobjekt verwendet wird.

(Geerbt von MarshalByRefObject)
Dispose()

Gibt alle Ressourcen frei, die von der aktuellen Instanz der WaitHandle Klasse verwendet werden.

(Geerbt von WaitHandle)
Dispose(Boolean)

Wenn sie in einer abgeleiteten Klasse überschrieben werden, werden die nicht verwalteten Ressourcen freigegeben, die von den WaitHandleverwalteten Ressourcen verwendet werden, und optional die verwalteten Ressourcen freigegeben.

(Geerbt von WaitHandle)
Equals(Object)

Bestimmt, ob das angegebene Objekt dem aktuellen Objekt entspricht.

(Geerbt von Object)
GetAccessControl()

Ruft ein EventWaitHandleSecurity Objekt ab, das die Zugriffssteuerungssicherheit für das benannte Systemereignis darstellt, das durch das aktuelle EventWaitHandle Objekt dargestellt wird.

GetHashCode()

Dient als Standardhashfunktion.

(Geerbt von Object)
GetLifetimeService()
Veraltet.

Ruft das aktuelle Lebensdauerdienstobjekt ab, das die Lebensdauerrichtlinie für diese Instanz steuert.

(Geerbt von MarshalByRefObject)
GetType()

Ruft die Type der aktuellen Instanz ab.

(Geerbt von Object)
InitializeLifetimeService()
Veraltet.

Ruft ein Lebensdauerdienstobjekt ab, um die Lebensdauerrichtlinie für diese Instanz zu steuern.

(Geerbt von MarshalByRefObject)
MemberwiseClone()

Erstellt eine flache Kopie der aktuellen Object.

(Geerbt von Object)
MemberwiseClone(Boolean)

Erstellt eine flache Kopie des aktuellen MarshalByRefObject Objekts.

(Geerbt von MarshalByRefObject)
OpenExisting(String, EventWaitHandleRights)

Öffnet das angegebene benannte Synchronisierungsereignis, sofern es bereits vorhanden ist, mit dem gewünschten Sicherheitszugriff.

OpenExisting(String, NamedWaitHandleOptions)

Öffnet das angegebene benannte Synchronisierungsereignis, sofern es bereits vorhanden ist. Wenn die Optionen nur auf den aktuellen Benutzer festgelegt sind, werden die Zugriffssteuerungen des Objekts für den aufrufenden Benutzer überprüft.

OpenExisting(String)

Öffnet das angegebene benannte Synchronisierungsereignis, sofern es bereits vorhanden ist.

Reset()

Legt den Status des Ereignisses auf "nicht signaliert" fest, wodurch Threads blockiert werden.

Set()

Legt den Status des Ereignisses fest, das signalisiert wird, sodass ein oder mehrere Wartethreads fortgesetzt werden können.

SetAccessControl(EventWaitHandleSecurity)

Legt die Zugriffssteuerungssicherheit für ein benanntes Systemereignis fest.

ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.

(Geerbt von Object)
TryOpenExisting(String, EventWaitHandle)

Öffnet das angegebene benannte Synchronisierungsereignis, sofern es bereits vorhanden ist, und gibt einen Wert zurück, der angibt, ob der Vorgang erfolgreich war.

TryOpenExisting(String, EventWaitHandleRights, EventWaitHandle)

Öffnet das angegebene benannte Synchronisierungsereignis, sofern es bereits vorhanden ist, mit dem gewünschten Sicherheitszugriff und gibt einen Wert zurück, der angibt, ob der Vorgang erfolgreich war.

TryOpenExisting(String, NamedWaitHandleOptions, EventWaitHandle)

Öffnet das angegebene benannte Synchronisierungsereignis, sofern es bereits vorhanden ist, und gibt einen Wert zurück, der angibt, ob der Vorgang erfolgreich war. Wenn die Optionen nur auf den aktuellen Benutzer festgelegt sind, werden die Zugriffssteuerungen des Objekts für den aufrufenden Benutzer überprüft.

WaitOne()

Blockiert den aktuellen Thread, bis der aktuelle WaitHandle Thread ein Signal empfängt.

(Geerbt von WaitHandle)
WaitOne(Int32, Boolean)

Blockiert den aktuellen Thread, bis der aktuelle WaitHandle Thread ein Signal empfängt, wobei eine 32-Bit-ganzzahl mit Vorzeichen verwendet wird, um das Zeitintervall anzugeben und anzugeben, ob die Synchronisierungsdomäne vor dem Warten beendet werden soll.

(Geerbt von WaitHandle)
WaitOne(Int32)

Blockiert den aktuellen Thread, bis der aktuelle WaitHandle Thread ein Signal empfängt, wobei eine 32-Bit-ganzzahl mit Vorzeichen verwendet wird, um das Zeitintervall in Millisekunden anzugeben.

(Geerbt von WaitHandle)
WaitOne(TimeSpan, Boolean)

Blockiert den aktuellen Thread, bis die aktuelle Instanz ein Signal empfängt, wobei ein TimeSpan Zeitintervall angegeben und angegeben wird, ob die Synchronisierungsdomäne vor der Wartezeit beendet werden soll.

(Geerbt von WaitHandle)
WaitOne(TimeSpan)

Blockiert den aktuellen Thread, bis die aktuelle Instanz ein Signal empfängt, wobei ein TimeSpan Zeitintervall angegeben wird.

(Geerbt von WaitHandle)

Explizite Schnittstellenimplementierungen

Name Beschreibung
IDisposable.Dispose()

Diese API unterstützt die Produktinfrastruktur und ist nicht für die direkte Verwendung aus Ihrem Code gedacht.

Veröffentlicht alle ressourcen, die von der WaitHandle.

(Geerbt von WaitHandle)

Erweiterungsmethoden

Name Beschreibung
GetAccessControl(EventWaitHandle)

Gibt die Sicherheitsbeschreibungen für den angegebenen handleWert zurück.

GetSafeWaitHandle(WaitHandle)

Ruft das sichere Handle für ein systemeigenes Betriebssystem-Wait Handle ab.

SetAccessControl(EventWaitHandle, EventWaitHandleSecurity)

Legt die Sicherheitsdeskriptoren für das angegebene Ereigniswartehandle fest.

SetSafeWaitHandle(WaitHandle, SafeWaitHandle)

Legt einen sicheren Handle für ein systemeigenes Betriebssystem-Wait Handle fest.

Gilt für:

Threadsicherheit

Dieser Typ ist threadsicher.

Weitere Informationen