EventWaitHandle Konstruktoren

Definition

Initialisiert eine neue Instanz der EventWaitHandle-Klasse.

Überlädt

Name Beschreibung
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.

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, 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)

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, 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, 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)

Quelle:
EventWaitHandle.cs
Quelle:
EventWaitHandle.cs
Quelle:
EventWaitHandle.cs
Quelle:
EventWaitHandle.cs
Quelle:
EventWaitHandle.cs

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.

public:
 EventWaitHandle(bool initialState, System::Threading::EventResetMode mode);
public EventWaitHandle(bool initialState, System.Threading.EventResetMode mode);
new System.Threading.EventWaitHandle : bool * System.Threading.EventResetMode -> System.Threading.EventWaitHandle
Public Sub New (initialState As Boolean, mode As EventResetMode)

Parameter

initialState
Boolean

true den zu signalisierenden Anfangszustand festzulegen; false um ihn auf "nicht signaliert" festzulegen.

mode
EventResetMode

Einer der EventResetMode Werte, der bestimmt, ob das Ereignis automatisch oder manuell zurückgesetzt wird.

Ausnahmen

Der mode Enumerationswert war außerhalb des zulässigen Bereichs.

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

Wenn der Anfangszustand des Ereignisses nicht signalisiert ist, werden Threads, die auf das Ereignis warten, blockiert. Wenn der anfängliche Zustand signalisiert ist und das ManualReset Flag für modeangegeben ist, werden Threads, die auf das Ereignis warten, nicht blockiert. Wenn der Anfangszustand signalisiert ist und mode ist AutoReset, wird der erste Thread, der auf das Ereignis wartet, sofort freigegeben, danach wird das Ereignis zurückgesetzt, und nachfolgende Threads werden blockiert.

Weitere Informationen

Gilt für:

EventWaitHandle(Boolean, EventResetMode, String)

Quelle:
EventWaitHandle.cs
Quelle:
EventWaitHandle.cs
Quelle:
EventWaitHandle.cs
Quelle:
EventWaitHandle.cs
Quelle:
EventWaitHandle.cs

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.

public:
 EventWaitHandle(bool initialState, System::Threading::EventResetMode mode, System::String ^ name);
[System.Security.SecurityCritical]
public EventWaitHandle(bool initialState, System.Threading.EventResetMode mode, string name);
public EventWaitHandle(bool initialState, System.Threading.EventResetMode mode, string? name);
public EventWaitHandle(bool initialState, System.Threading.EventResetMode mode, string name);
[<System.Security.SecurityCritical>]
new System.Threading.EventWaitHandle : bool * System.Threading.EventResetMode * string -> System.Threading.EventWaitHandle
new System.Threading.EventWaitHandle : bool * System.Threading.EventResetMode * string -> System.Threading.EventWaitHandle
Public Sub New (initialState As Boolean, mode As EventResetMode, name As String)

Parameter

initialState
Boolean

true zum Festlegen des Anfangszustands, der signalisiert wird, wenn das benannte Ereignis als Ergebnis dieses Aufrufs erstellt wird; false um ihn auf "nicht signaliert" festzulegen.

mode
EventResetMode

Einer der EventResetMode Werte, der bestimmt, ob das Ereignis automatisch oder manuell zurückgesetzt wird.

name
String

Der Name, wenn das Synchronisierungsobjekt für andere Prozesse freigegeben werden soll; null andernfalls oder eine leere Zeichenfolge. Bei dem Namen wird die Groß-/Kleinschreibung beachtet. Das umgekehrte Schrägstrichzeichen (\) ist reserviert und kann nur verwendet werden, um einen Namespace anzugeben. Weitere Informationen zu Namespaces finden Sie im Abschnitt "Hinweise". Je nach Betriebssystem kann es weitere Einschränkungen für den Namen geben. Bei Unix-basierten Betriebssystemen muss beispielsweise der Name nach Ausschluss des Namespaces ein gültiger Dateiname sein.

Attribute

Ausnahmen

name ist ungültig. Dies kann aus verschiedenen Gründen sein, einschließlich einiger Einschränkungen, die vom Betriebssystem platziert werden können, z. B. ein unbekanntes Präfix oder ungültige Zeichen. Beachten Sie, dass bei namen und allgemeinen Präfixen "Global\" und "Local\" die Groß-/Kleinschreibung beachtet wird.

- oder -

Es gab einen anderen Fehler. Die HResult Eigenschaft kann weitere Informationen bereitstellen.

nur Windows: name einen unbekannten Namespace angegeben. Weitere Informationen finden Sie unter Objektnamen .

name ist zu lang. Längenbeschränkungen hängen möglicherweise vom Betriebssystem oder der Konfiguration ab.

Das benannte Ereignis ist vorhanden und verfügt über Zugriffssteuerungssicherheit, aber der Benutzer hat nicht FullControl.

Ein Synchronisierungsobjekt mit dem bereitgestellten name Objekt kann nicht erstellt werden. Ein Synchronisierungsobjekt eines anderen Typs hat möglicherweise denselben Namen.

Der mode Enumerationswert war außerhalb des zulässigen Bereichs.

- oder -

.NET Framework: name ist länger als MAX_PATH (260 Zeichen).

Hinweise

Das name Präfix kann einem Global\ Namespace vorangestellt oder Local\ angegeben werden. Wenn der Global Namespace angegeben wird, kann das Synchronisierungsobjekt für alle Prozesse im System freigegeben werden. Wenn der Local Namespace angegeben wird, was auch der Standardwert ist, wenn kein Namespace angegeben wird, kann das Synchronisierungsobjekt für Prozesse in derselben Sitzung freigegeben werden. Bei Windows ist eine Sitzung eine Anmeldesitzung, und Dienste werden in der Regel in einer anderen nicht interaktiven Sitzung ausgeführt. Auf Unix-ähnlichen Betriebssystemen verfügt jede Shell über eine eigene Sitzung. Sitzungslokale Synchronisierungsobjekte sind möglicherweise für die Synchronisierung zwischen Prozessen mit einer Beziehung zwischen übergeordnetem/untergeordnetem Element geeignet, in der sie alle in derselben Sitzung ausgeführt werden. Weitere Informationen zu Synchronisierungsobjektnamen in Windows finden Sie unter Object Names.

Wenn ein name Synchronisierungsobjekt des angeforderten Typs bereits im Namespace vorhanden ist, wird das vorhandene Synchronisierungsobjekt geöffnet. Wenn bereits ein Synchronisierungsobjekt eines anderen Typs im Namespace vorhanden ist, wird ein WaitHandleCannotBeOpenedException Fehler ausgelöst. Andernfalls wird ein neues Synchronisierungsobjekt erstellt.

Wenn bereits ein Systemereignis mit dem für den name Parameter angegebenen Namen vorhanden ist, wird der initialState Parameter ignoriert.

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.

Von Bedeutung

Wenn Sie diesen Konstruktor für benannte Systemereignisse verwenden, geben Sie false für initialState. Dieser Konstruktor bietet keine Möglichkeit, festzustellen, ob ein benanntes Systemereignis erstellt wurde, sodass Sie keine Annahmen über den Status des benannten Ereignisses treffen können. Um festzustellen, ob ein benanntes Ereignis erstellt wurde, verwenden Sie den EventWaitHandle(Boolean, EventResetMode, String, Boolean) Konstruktor oder den EventWaitHandle(Boolean, EventResetMode, String, Boolean, EventWaitHandleSecurity) Konstruktor.

Wenn der Anfangszustand des Ereignisses nicht signalisiert ist, werden Threads, die auf das Ereignis warten, blockiert. Wenn der anfängliche Zustand signalisiert ist und das ManualReset Flag für modeangegeben ist, werden Threads, die auf das Ereignis warten, nicht blockiert. Wenn der Anfangszustand signalisiert ist und mode ist AutoReset, wird der erste Thread, der auf das Ereignis wartet, sofort freigegeben, danach wird das Ereignis zurückgesetzt, und nachfolgende Threads werden blockiert.

Weitere Informationen

Gilt für:

EventWaitHandle(Boolean, EventResetMode, String, Boolean)

Quelle:
EventWaitHandle.cs
Quelle:
EventWaitHandle.cs
Quelle:
EventWaitHandle.cs
Quelle:
EventWaitHandle.cs
Quelle:
EventWaitHandle.cs

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.

public:
 EventWaitHandle(bool initialState, System::Threading::EventResetMode mode, System::String ^ name, [Runtime::InteropServices::Out] bool % createdNew);
[System.Security.SecurityCritical]
public EventWaitHandle(bool initialState, System.Threading.EventResetMode mode, string name, out bool createdNew);
public EventWaitHandle(bool initialState, System.Threading.EventResetMode mode, string? name, out bool createdNew);
public EventWaitHandle(bool initialState, System.Threading.EventResetMode mode, string name, out bool createdNew);
[<System.Security.SecurityCritical>]
new System.Threading.EventWaitHandle : bool * System.Threading.EventResetMode * string * bool -> System.Threading.EventWaitHandle
new System.Threading.EventWaitHandle : bool * System.Threading.EventResetMode * string * bool -> System.Threading.EventWaitHandle
Public Sub New (initialState As Boolean, mode As EventResetMode, name As String, ByRef createdNew As Boolean)

Parameter

initialState
Boolean

true zum Festlegen des Anfangszustands, der signalisiert wird, wenn das benannte Ereignis als Ergebnis dieses Aufrufs erstellt wird; false um ihn auf "nicht signaliert" festzulegen.

mode
EventResetMode

Einer der EventResetMode Werte, der bestimmt, ob das Ereignis automatisch oder manuell zurückgesetzt wird.

name
String

Der Name, wenn das Synchronisierungsobjekt für andere Prozesse freigegeben werden soll; null andernfalls oder eine leere Zeichenfolge. Bei dem Namen wird die Groß-/Kleinschreibung beachtet. Das umgekehrte Schrägstrichzeichen (\) ist reserviert und kann nur verwendet werden, um einen Namespace anzugeben. Weitere Informationen zu Namespaces finden Sie im Abschnitt "Hinweise". Je nach Betriebssystem kann es weitere Einschränkungen für den Namen geben. Bei Unix-basierten Betriebssystemen muss beispielsweise der Name nach Ausschluss des Namespaces ein gültiger Dateiname sein.

createdNew
Boolean

Wenn diese Methode zurückgegeben wird, enthält, true ob ein lokales Ereignis erstellt wurde (d. h. wenn name es sich um eine leere Zeichenfolge handelt null ) oder ob das angegebene benannte Systemereignis erstellt wurde; false wenn das angegebene benannte Systemereignis bereits vorhanden ist. Dieser Parameter wird nicht initialisiert übergeben.

Attribute

Ausnahmen

name ist ungültig. Dies kann aus verschiedenen Gründen sein, einschließlich einiger Einschränkungen, die vom Betriebssystem platziert werden können, z. B. ein unbekanntes Präfix oder ungültige Zeichen. Beachten Sie, dass bei namen und allgemeinen Präfixen "Global\" und "Local\" die Groß-/Kleinschreibung beachtet wird.

- oder -

Es gab einen anderen Fehler. Die HResult Eigenschaft kann weitere Informationen bereitstellen.

nur Windows: name einen unbekannten Namespace angegeben. Weitere Informationen finden Sie unter Objektnamen .

name ist zu lang. Längenbeschränkungen hängen möglicherweise vom Betriebssystem oder der Konfiguration ab.

Das benannte Ereignis ist vorhanden und verfügt über Zugriffssteuerungssicherheit, aber der Benutzer hat nicht FullControl.

Ein Synchronisierungsobjekt mit dem bereitgestellten name Objekt kann nicht erstellt werden. Ein Synchronisierungsobjekt eines anderen Typs hat möglicherweise denselben Namen.

Der mode Enumerationswert war außerhalb des zulässigen Bereichs.

- oder -

.NET Framework: name ist länger als MAX_PATH (260 Zeichen).

Hinweise

Das name Präfix kann einem Global\ Namespace vorangestellt oder Local\ angegeben werden. Wenn der Global Namespace angegeben wird, kann das Synchronisierungsobjekt für alle Prozesse im System freigegeben werden. Wenn der Local Namespace angegeben wird, was auch der Standardwert ist, wenn kein Namespace angegeben wird, kann das Synchronisierungsobjekt für Prozesse in derselben Sitzung freigegeben werden. Bei Windows ist eine Sitzung eine Anmeldesitzung, und Dienste werden in der Regel in einer anderen nicht interaktiven Sitzung ausgeführt. Auf Unix-ähnlichen Betriebssystemen verfügt jede Shell über eine eigene Sitzung. Sitzungslokale Synchronisierungsobjekte sind möglicherweise für die Synchronisierung zwischen Prozessen mit einer Beziehung zwischen übergeordnetem/untergeordnetem Element geeignet, in der sie alle in derselben Sitzung ausgeführt werden. Weitere Informationen zu Synchronisierungsobjektnamen in Windows finden Sie unter Object Names.

Wenn ein name Synchronisierungsobjekt des angeforderten Typs bereits im Namespace vorhanden ist, wird das vorhandene Synchronisierungsobjekt geöffnet. Wenn bereits ein Synchronisierungsobjekt eines anderen Typs im Namespace vorhanden ist, wird ein WaitHandleCannotBeOpenedException Fehler ausgelöst. Andernfalls wird ein neues Synchronisierungsobjekt erstellt.

Wenn bereits ein Systemereignis mit dem für den name Parameter angegebenen Namen vorhanden ist, wird der initialState Parameter ignoriert. Verwenden Sie nach dem Aufrufen dieses Konstruktors den Wert in der variablen, die für den Parameter ref (parameter ByRef in Visual Basic)createdNew angegeben ist, um zu bestimmen, ob das benannte Systemereignis bereits vorhanden oder erstellt wurde.

Wenn der Anfangszustand des Ereignisses nicht signalisiert ist, werden Threads, die auf das Ereignis warten, blockiert. Wenn der anfängliche Zustand signalisiert ist und das ManualReset Flag für modeangegeben ist, werden Threads, die auf das Ereignis warten, nicht blockiert. Wenn der Anfangszustand signalisiert ist und mode ist AutoReset, wird der erste Thread, der auf das Ereignis wartet, sofort freigegeben, danach wird das Ereignis zurückgesetzt, und nachfolgende Threads werden blockiert.

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.

Weitere Informationen

Gilt für:

EventWaitHandle(Boolean, EventResetMode, String, NamedWaitHandleOptions)

Quelle:
EventWaitHandle.cs
Quelle:
EventWaitHandle.cs

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.

public:
 EventWaitHandle(bool initialState, System::Threading::EventResetMode mode, System::String ^ name, System::Threading::NamedWaitHandleOptions options);
public EventWaitHandle(bool initialState, System.Threading.EventResetMode mode, string? name, System.Threading.NamedWaitHandleOptions options);
new System.Threading.EventWaitHandle : bool * System.Threading.EventResetMode * string * System.Threading.NamedWaitHandleOptions -> System.Threading.EventWaitHandle
Public Sub New (initialState As Boolean, mode As EventResetMode, name As String, options As NamedWaitHandleOptions)

Parameter

initialState
Boolean

true zum Festlegen des Anfangszustands, der signalisiert wird, wenn das benannte Ereignis als Ergebnis dieses Aufrufs erstellt wird; false um ihn auf "nicht signaliert" festzulegen.

mode
EventResetMode

Einer der EventResetMode Werte, der bestimmt, ob das Ereignis automatisch oder manuell zurückgesetzt wird.

name
String

Der Name, wenn das Synchronisierungsobjekt für andere Prozesse freigegeben werden soll; null andernfalls oder eine leere Zeichenfolge. Bei dem Namen wird die Groß-/Kleinschreibung beachtet.

options
NamedWaitHandleOptions

Die Bereichsoptionen für den benannten Handle. Standardmäßig ist der Zugriff auf den aktuellen Benutzer und die aktuelle Sitzung beschränkt. Die angegebenen Optionen können sich auf den Namespace für den Namen und den Zugriff auf das zugrunde liegende Handle-Objekt auswirken.

Ausnahmen

name ist ungültig. Dies kann aus verschiedenen Gründen sein, einschließlich einiger Einschränkungen, die vom Betriebssystem platziert werden können, z. B. ein unbekanntes Präfix oder ungültige Zeichen. Beachten Sie, dass bei namen und allgemeinen Präfixen "Global\" und "Local\" die Groß-/Kleinschreibung beachtet wird.

- oder -

Es gab einen anderen Fehler. Die HResult Eigenschaft kann weitere Informationen bereitstellen.

nur Windows: name einen unbekannten Namespace angegeben. Weitere Informationen finden Sie unter Objektnamen .

name ist zu lang. Längenbeschränkungen hängen möglicherweise vom Betriebssystem oder der Konfiguration ab.

Das benannte Ereignis ist vorhanden und verfügt über Zugriffssteuerungssicherheit, aber der Benutzer hat nicht FullControl.

Ein Synchronisierungsobjekt mit dem bereitgestellten name Objekt kann nicht erstellt werden. Ein Synchronisierungsobjekt eines anderen Typs hat möglicherweise denselben Namen. - oder -

Ein Objekt mit dem angegebenen name Objekt ist vorhanden, die angegebenen options Sind jedoch nicht mit den Optionen des vorhandenen Objekts kompatibel.

Der mode Enumerationswert war außerhalb des zulässigen Bereichs.

Hinweise

Wenn ein name Synchronisierungsobjekt des angeforderten Typs bereits im Namespace vorhanden ist, wird das vorhandene Synchronisierungsobjekt geöffnet. Wenn options jedoch der Zugriff auf den aktuellen Benutzer beschränkt ist und das Synchronisierungsobjekt nicht kompatibel ist, wird ein WaitHandleCannotBeOpenedException Fehler ausgelöst. Wenn ein Synchronisierungsobjekt eines anderen Typs bereits im Namespace vorhanden ist, wird auch ein WaitHandleCannotBeOpenedException Fehler ausgelöst. Andernfalls wird ein neues Synchronisierungsobjekt erstellt.

Wenn bereits ein Systemereignis mit dem für den name Parameter angegebenen Namen vorhanden ist, wird der initialState Parameter ignoriert.

Von Bedeutung

Wenn Sie diesen Konstruktor für benannte Systemereignisse verwenden, geben Sie false für initialState. Dieser Konstruktor bietet keine Möglichkeit, zu bestimmen, ob ein benanntes Systemereignis erstellt wurde, sodass Sie keine Annahmen über den Status des benannten Ereignisses treffen können. Um festzustellen, ob ein benanntes Ereignis erstellt wurde, verwenden Sie den EventWaitHandle(Boolean, EventResetMode, String, Boolean) Konstruktor oder den EventWaitHandle(Boolean, EventResetMode, String, Boolean, EventWaitHandleSecurity) Konstruktor.

Wenn der Anfangszustand des Ereignisses nicht signalisiert ist, werden Threads, die auf das Ereignis warten, blockiert. Wenn der Anfangszustand signalisiert ist und das ManualReset Flag für modeangegeben ist, werden Threads, die auf das Ereignis warten, nicht blockiert. Wenn der Anfangszustand signalisiert ist und mode ist AutoReset, wird der erste Thread, der auf das Ereignis wartet, sofort freigegeben, danach wird das Ereignis zurückgesetzt und nachfolgende Threads blockiert.

Auf Windows können options bereitgestellt werden, um anzugeben, ob das benannte Systemereignis nur für den aktuellen Benutzer oder für alle Benutzer zugänglich ist. Außerdem können Sie angeben, ob das benannte Systemereignis nur für Prozesse in der aktuellen Sitzung oder für alle Sitzungen zugänglich ist. Weitere Informationen finden Sie unter NamedWaitHandleOptions.

Vorsicht

Auf Unix-basierten Betriebssystemen wirkt sich der options Parameter nicht aus, da benannte Systemereignisse nicht unterstützt werden.

Weitere Informationen

Gilt für:

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.

public:
 EventWaitHandle(bool initialState, System::Threading::EventResetMode mode, System::String ^ name, [Runtime::InteropServices::Out] bool % createdNew, System::Security::AccessControl::EventWaitHandleSecurity ^ eventSecurity);
public EventWaitHandle(bool initialState, System.Threading.EventResetMode mode, string name, out bool createdNew, System.Security.AccessControl.EventWaitHandleSecurity eventSecurity);
[System.Security.SecurityCritical]
public EventWaitHandle(bool initialState, System.Threading.EventResetMode mode, string name, out bool createdNew, System.Security.AccessControl.EventWaitHandleSecurity eventSecurity);
new System.Threading.EventWaitHandle : bool * System.Threading.EventResetMode * string * bool * System.Security.AccessControl.EventWaitHandleSecurity -> System.Threading.EventWaitHandle
[<System.Security.SecurityCritical>]
new System.Threading.EventWaitHandle : bool * System.Threading.EventResetMode * string * bool * System.Security.AccessControl.EventWaitHandleSecurity -> System.Threading.EventWaitHandle
Public Sub New (initialState As Boolean, mode As EventResetMode, name As String, ByRef createdNew As Boolean, eventSecurity As EventWaitHandleSecurity)

Parameter

initialState
Boolean

true zum Festlegen des Anfangszustands, der signalisiert wird, wenn das benannte Ereignis als Ergebnis dieses Aufrufs erstellt wird; false um ihn auf "nicht signaliert" festzulegen.

mode
EventResetMode

Einer der EventResetMode Werte, der bestimmt, ob das Ereignis automatisch oder manuell zurückgesetzt wird.

name
String

Der Name, wenn das Synchronisierungsobjekt für andere Prozesse freigegeben werden soll; null andernfalls oder eine leere Zeichenfolge. Bei dem Namen wird die Groß-/Kleinschreibung beachtet. Das umgekehrte Schrägstrichzeichen (\) ist reserviert und kann nur verwendet werden, um einen Namespace anzugeben. Weitere Informationen zu Namespaces finden Sie im Abschnitt "Hinweise". Je nach Betriebssystem kann es weitere Einschränkungen für den Namen geben. Bei Unix-basierten Betriebssystemen muss beispielsweise der Name nach Ausschluss des Namespaces ein gültiger Dateiname sein.

createdNew
Boolean

Wenn diese Methode zurückgegeben wird, enthält, true ob ein lokales Ereignis erstellt wurde (d. h. wenn name es sich um eine leere Zeichenfolge handelt null ) oder ob das angegebene benannte Systemereignis erstellt wurde; false wenn das angegebene benannte Systemereignis bereits vorhanden ist. Dieser Parameter wird nicht initialisiert übergeben.

eventSecurity
EventWaitHandleSecurity

Ein EventWaitHandleSecurity Objekt, das die Zugriffssteuerungssicherheit darstellt, die auf das benannte Systemereignis angewendet werden soll.

Attribute

Ausnahmen

name ist ungültig. Dies kann aus verschiedenen Gründen sein, einschließlich einiger Einschränkungen, die vom Betriebssystem platziert werden können, z. B. ein unbekanntes Präfix oder ungültige Zeichen. Beachten Sie, dass bei namen und allgemeinen Präfixen "Global\" und "Local\" die Groß-/Kleinschreibung beachtet wird.

- oder -

Es gab einen anderen Fehler. Die HResult Eigenschaft kann weitere Informationen bereitstellen.

nur Windows: name einen unbekannten Namespace angegeben. Weitere Informationen finden Sie unter Objektnamen .

name ist zu lang. Längenbeschränkungen hängen möglicherweise vom Betriebssystem oder der Konfiguration ab.

Das benannte Ereignis ist vorhanden und verfügt über Zugriffssteuerungssicherheit, aber der Benutzer hat nicht FullControl.

Ein Synchronisierungsobjekt mit dem bereitgestellten name Objekt kann nicht erstellt werden. Ein Synchronisierungsobjekt eines anderen Typs hat möglicherweise denselben Namen.

Der mode Enumerationswert war außerhalb des zulässigen Bereichs.

- oder -

.NET Framework: name ist länger als MAX_PATH (260 Zeichen).

Beispiele

Im folgenden Codebeispiel wird das prozessübergreifende Verhalten eines benannten Systemereignisses mit Zugriffssteuerungssicherheit veranschaulicht. Im Beispiel wird die OpenExisting(String) Methodenüberladung verwendet, um das Vorhandensein eines benannten Ereignisses zu testen.

Wenn das Ereignis nicht vorhanden ist, wird es mit der ursprünglichen Besitz- und Zugriffssteuerungssicherheit erstellt, die dem aktuellen Benutzer das Recht auf Nutzung des Ereignisses verweigert, aber das Recht gewährt, Berechtigungen für das Ereignis zu lesen und zu ändern.

Wenn Sie das kompilierte Beispiel aus zwei Befehlsfenstern ausführen, löst die zweite Kopie eine Zugriffsverletzungs-Ausnahme für den Aufruf OpenExisting(String)aus. Die Ausnahme wird abgefangen, und im Beispiel wird die OpenExisting(String, EventWaitHandleRights) Methodenüberladung verwendet, um auf das Ereignis mit den zum Lesen und Ändern der Berechtigungen erforderlichen Berechtigungen zu warten.

Nachdem die Berechtigungen geändert wurden, wird das Ereignis mit den zum Warten erforderlichen Rechten geöffnet und signalisiert. Wenn Sie das kompilierte Beispiel aus einem dritten Befehlsfenster ausführen, wird das Beispiel mit den neuen Berechtigungen ausgeführt.

using System;
using System.Threading;
using System.Security.AccessControl;

internal class Example
{
    internal static void Main()
    {
        const string ewhName = "EventWaitHandleExample5";

        EventWaitHandle ewh = null;
        bool doesNotExist = false;
        bool unauthorized = false;

        // The value of this variable is set by the event
        // constructor. It is true if the named system event was
        // created, and false if the named event already existed.
        //
        bool wasCreated;

        // Attempt to open the named event.
        try
        {
            // Open the event with (EventWaitHandleRights.Synchronize
            // | EventWaitHandleRights.Modify), to wait on and 
            // signal the named event.
            //
            ewh = EventWaitHandle.OpenExisting(ewhName);
        }
        catch (WaitHandleCannotBeOpenedException)
        {
            Console.WriteLine("Named event does not exist.");
            doesNotExist = true;
        }
        catch (UnauthorizedAccessException ex)
        {
            Console.WriteLine("Unauthorized access: {0}", ex.Message);
            unauthorized = true;
        }

        // There are three cases: (1) The event does not exist.
        // (2) The event exists, but the current user doesn't 
        // have access. (3) The event exists and the user has
        // access.
        //
        if (doesNotExist)
        {
            // The event does not exist, so create it.

            // Create an access control list (ACL) that denies the
            // current user the right to wait on or signal the 
            // event, but allows the right to read and change
            // security information for the event.
            //
            string user = Environment.UserDomainName + "\\"
                + Environment.UserName;
            EventWaitHandleSecurity ewhSec = 
                new EventWaitHandleSecurity();

            EventWaitHandleAccessRule rule = 
                new EventWaitHandleAccessRule(user, 
                    EventWaitHandleRights.Synchronize | 
                    EventWaitHandleRights.Modify, 
                    AccessControlType.Deny);
            ewhSec.AddAccessRule(rule);

            rule = new EventWaitHandleAccessRule(user, 
                EventWaitHandleRights.ReadPermissions | 
                EventWaitHandleRights.ChangePermissions, 
                AccessControlType.Allow);
            ewhSec.AddAccessRule(rule);

            // Create an EventWaitHandle object that represents
            // the system event named by the constant 'ewhName', 
            // initially signaled, with automatic reset, and with
            // the specified security access. The Boolean value that 
            // indicates creation of the underlying system object
            // is placed in wasCreated.
            //
            ewh = new EventWaitHandle(true, 
                EventResetMode.AutoReset, 
                ewhName, 
                out wasCreated, 
                ewhSec);

            // If the named system event was created, it can be
            // used by the current instance of this program, even 
            // though the current user is denied access. The current
            // program owns the event. Otherwise, exit the program.
            // 
            if (wasCreated)
            {
                Console.WriteLine("Created the named event.");
            }
            else
            {
                Console.WriteLine("Unable to create the event.");
                return;
            }
        }
        else if (unauthorized)
        {
            // Open the event to read and change the access control
            // security. The access control security defined above
            // allows the current user to do this.
            //
            try
            {
                ewh = EventWaitHandle.OpenExisting(ewhName, 
                    EventWaitHandleRights.ReadPermissions | 
                    EventWaitHandleRights.ChangePermissions);

                // Get the current ACL. This requires 
                // EventWaitHandleRights.ReadPermissions.
                EventWaitHandleSecurity ewhSec = ewh.GetAccessControl();
                
                string user = Environment.UserDomainName + "\\"
                    + Environment.UserName;

                // First, the rule that denied the current user 
                // the right to enter and release the event must
                // be removed.
                EventWaitHandleAccessRule rule = 
                    new EventWaitHandleAccessRule(user, 
                        EventWaitHandleRights.Synchronize | 
                        EventWaitHandleRights.Modify, 
                        AccessControlType.Deny);
                ewhSec.RemoveAccessRule(rule);

                // Now grant the user the correct rights.
                // 
                rule = new EventWaitHandleAccessRule(user, 
                    EventWaitHandleRights.Synchronize | 
                    EventWaitHandleRights.Modify, 
                    AccessControlType.Allow);
                ewhSec.AddAccessRule(rule);

                // Update the ACL. This requires
                // EventWaitHandleRights.ChangePermissions.
                ewh.SetAccessControl(ewhSec);

                Console.WriteLine("Updated event security.");

                // Open the event with (EventWaitHandleRights.Synchronize 
                // | EventWaitHandleRights.Modify), the rights required
                // to wait on and signal the event.
                //
                ewh = EventWaitHandle.OpenExisting(ewhName);
            }
            catch (UnauthorizedAccessException ex)
            {
                Console.WriteLine("Unable to change permissions: {0}",
                    ex.Message);
                return;
            }
        }

        // Wait on the event, and hold it until the program
        // exits.
        //
        try
        {
            Console.WriteLine("Wait on the event.");
            ewh.WaitOne();
            Console.WriteLine("Event was signaled.");
            Console.WriteLine("Press the Enter key to signal the event and exit.");
            Console.ReadLine();
        }
        catch (UnauthorizedAccessException ex)
        {
            Console.WriteLine("Unauthorized access: {0}", ex.Message);
        }
        finally
        {
            ewh.Set();
        }
    }
}
Imports System.Threading
Imports System.Security.AccessControl

Friend Class Example

    <MTAThread> _
    Friend Shared Sub Main()
        Const ewhName As String = "EventWaitHandleExample5"

        Dim ewh As EventWaitHandle = Nothing
        Dim doesNotExist as Boolean = False
        Dim unauthorized As Boolean = False

        ' The value of this variable is set by the event
        ' constructor. It is True if the named system event was
        ' created, and False if the named event already existed.
        '
        Dim wasCreated As Boolean

        ' Attempt to open the named event.
        Try
            ' Open the event with (EventWaitHandleRights.Synchronize
            ' Or EventWaitHandleRights.Modify), to wait on and 
            ' signal the named event.
            '
            ewh = EventWaitHandle.OpenExisting(ewhName)
        Catch ex As WaitHandleCannotBeOpenedException
            Console.WriteLine("Named event does not exist.")
            doesNotExist = True
        Catch ex As UnauthorizedAccessException
            Console.WriteLine("Unauthorized access: {0}", ex.Message)
            unauthorized = True
        End Try

        ' There are three cases: (1) The event does not exist.
        ' (2) The event exists, but the current user doesn't 
        ' have access. (3) The event exists and the user has
        ' access.
        '
        If doesNotExist Then
            ' The event does not exist, so create it.

            ' Create an access control list (ACL) that denies the
            ' current user the right to wait on or signal the 
            ' event, but allows the right to read and change
            ' security information for the event.
            '
            Dim user As String = Environment.UserDomainName _ 
                & "\" & Environment.UserName
            Dim ewhSec As New EventWaitHandleSecurity()

            Dim rule As New EventWaitHandleAccessRule(user, _
                EventWaitHandleRights.Synchronize Or _
                EventWaitHandleRights.Modify, _
                AccessControlType.Deny)
            ewhSec.AddAccessRule(rule)

            rule = New EventWaitHandleAccessRule(user, _
                EventWaitHandleRights.ReadPermissions Or _
                EventWaitHandleRights.ChangePermissions, _
                AccessControlType.Allow)
            ewhSec.AddAccessRule(rule)

            ' Create an EventWaitHandle object that represents
            ' the system event named by the constant 'ewhName', 
            ' initially signaled, with automatic reset, and with
            ' the specified security access. The Boolean value that 
            ' indicates creation of the underlying system object
            ' is placed in wasCreated.
            '
            ewh = New EventWaitHandle(True, _
                EventResetMode.AutoReset, ewhName, _
                wasCreated, ewhSec)

            ' If the named system event was created, it can be
            ' used by the current instance of this program, even 
            ' though the current user is denied access. The current
            ' program owns the event. Otherwise, exit the program.
            ' 
            If wasCreated Then
                Console.WriteLine("Created the named event.")
            Else
                Console.WriteLine("Unable to create the event.")
                Return
            End If

        ElseIf unauthorized Then

            ' Open the event to read and change the access control
            ' security. The access control security defined above
            ' allows the current user to do this.
            '
            Try
                ewh = EventWaitHandle.OpenExisting(ewhName, _
                    EventWaitHandleRights.ReadPermissions Or _
                    EventWaitHandleRights.ChangePermissions)

                ' Get the current ACL. This requires 
                ' EventWaitHandleRights.ReadPermissions.
                Dim ewhSec As EventWaitHandleSecurity = _
                    ewh.GetAccessControl()
                
                Dim user As String = Environment.UserDomainName _ 
                    & "\" & Environment.UserName

                ' First, the rule that denied the current user 
                ' the right to enter and release the event must
                ' be removed.
                Dim rule As New EventWaitHandleAccessRule(user, _
                    EventWaitHandleRights.Synchronize Or _
                    EventWaitHandleRights.Modify, _
                    AccessControlType.Deny)
                ewhSec.RemoveAccessRule(rule)

                ' Now grant the user the correct rights.
                ' 
                rule = New EventWaitHandleAccessRule(user, _
                    EventWaitHandleRights.Synchronize Or _
                    EventWaitHandleRights.Modify, _
                    AccessControlType.Allow)
                ewhSec.AddAccessRule(rule)

                ' Update the ACL. This requires
                ' EventWaitHandleRights.ChangePermissions.
                ewh.SetAccessControl(ewhSec)

                Console.WriteLine("Updated event security.")

                ' Open the event with (EventWaitHandleRights.Synchronize 
                ' Or EventWaitHandleRights.Modify), the rights required
                ' to wait on and signal the event.
                '
                ewh = EventWaitHandle.OpenExisting(ewhName)

            Catch ex As UnauthorizedAccessException
                Console.WriteLine("Unable to change permissions: {0}", _
                    ex.Message)
                Return
            End Try

        End If

        ' Wait on the event, and hold it until the program
        ' exits.
        '
        Try
            Console.WriteLine("Wait on the event.")
            ewh.WaitOne()
            Console.WriteLine("Event was signaled.")
            Console.WriteLine("Press the Enter key to signal the event and exit.")
            Console.ReadLine()
        Catch ex As UnauthorizedAccessException
            Console.WriteLine("Unauthorized access: {0}", _
                ex.Message)
        Finally
            ewh.Set()
        End Try
    End Sub 
End Class

Hinweise

Verwenden Sie diesen Konstruktor, um die Zugriffssteuerungssicherheit auf ein benanntes Systemereignis anzuwenden, wenn es erstellt wird, um zu verhindern, dass anderer Code die Kontrolle über das Ereignis übernimmt.

Dieser Konstruktor initialisiert ein EventWaitHandle Objekt, das ein Systemereignis darstellt. Sie können mehrere EventWaitHandle Objekte erstellen, die dasselbe Systemereignis darstellen.

Wenn das Systemereignis nicht vorhanden ist, wird es mit der angegebenen Zugriffssteuerungssicherheit erstellt. Wenn das Ereignis vorhanden ist, wird die angegebene Zugriffssteuerungssicherheit ignoriert.

Note

Der Aufrufer hat die vollständige Kontrolle über das neu erstellte EventWaitHandle Objekt, auch wenn eventSecurity dem aktuellen Benutzer einige Zugriffsrechte verweigert oder nicht gewährt werden. Wenn der aktuelle Benutzer jedoch versucht, ein anderes EventWaitHandle-Objekt abzurufen, um dasselbe benannte Ereignis darzustellen, wird entweder ein Konstruktor oder die OpenExisting-Methode verwendet, Windows Zugriffssteuerungssicherheit angewendet.

Das name Präfix kann einem Global\ Namespace vorangestellt oder Local\ angegeben werden. Wenn der Global Namespace angegeben wird, kann das Synchronisierungsobjekt für alle Prozesse im System freigegeben werden. Wenn der Local Namespace angegeben wird, was auch der Standardwert ist, wenn kein Namespace angegeben wird, kann das Synchronisierungsobjekt für Prozesse in derselben Sitzung freigegeben werden. Bei Windows ist eine Sitzung eine Anmeldesitzung, und Dienste werden in der Regel in einer anderen nicht interaktiven Sitzung ausgeführt. Auf Unix-ähnlichen Betriebssystemen verfügt jede Shell über eine eigene Sitzung. Sitzungslokale Synchronisierungsobjekte sind möglicherweise für die Synchronisierung zwischen Prozessen mit einer Beziehung zwischen übergeordnetem/untergeordnetem Element geeignet, in der sie alle in derselben Sitzung ausgeführt werden. Weitere Informationen zu Synchronisierungsobjektnamen in Windows finden Sie unter Object Names.

Wenn ein name Synchronisierungsobjekt des angeforderten Typs bereits im Namespace vorhanden ist, wird das vorhandene Synchronisierungsobjekt geöffnet. Wenn bereits ein Synchronisierungsobjekt eines anderen Typs im Namespace vorhanden ist, wird ein WaitHandleCannotBeOpenedException Fehler ausgelöst. Andernfalls wird ein neues Synchronisierungsobjekt erstellt.

Wenn bereits ein Systemereignis mit dem für den name Parameter angegebenen Namen vorhanden ist, wird der initialState Parameter ignoriert. Verwenden Sie nach dem Aufrufen dieses Konstruktors den Wert in der variablen, die für den Parameter ref (parameter ByRef in Visual Basic) createdNew angegeben ist, um zu bestimmen, ob das benannte Systemereignis bereits vorhanden oder erstellt wurde.

Wenn der Anfangszustand des Ereignisses nicht signalisiert ist, werden Threads, die auf das Ereignis warten, blockiert. Wenn der anfängliche Zustand signalisiert ist und das ManualReset Flag für modeangegeben ist, werden Threads, die auf das Ereignis warten, nicht blockiert. Wenn der Anfangszustand signalisiert ist und mode ist AutoReset, wird der erste Thread, der auf das Ereignis wartet, sofort freigegeben, danach wird das Ereignis zurückgesetzt, und nachfolgende Threads werden blockiert.

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 beim Erstellen des benannten Ereignisses ein EventWaitHandleSecurity übergeben. Vermeiden Sie die Verwendung benannter Ereignisse ohne Zugriffsbeschränkungen für Systeme, die möglicherweise nicht vertrauenswürdige Benutzer haben, die Code ausführen.

Weitere Informationen

Gilt für:

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

Quelle:
EventWaitHandle.cs
Quelle:
EventWaitHandle.cs

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.

public:
 EventWaitHandle(bool initialState, System::Threading::EventResetMode mode, System::String ^ name, System::Threading::NamedWaitHandleOptions options, [Runtime::InteropServices::Out] bool % createdNew);
public EventWaitHandle(bool initialState, System.Threading.EventResetMode mode, string? name, System.Threading.NamedWaitHandleOptions options, out bool createdNew);
new System.Threading.EventWaitHandle : bool * System.Threading.EventResetMode * string * System.Threading.NamedWaitHandleOptions * bool -> System.Threading.EventWaitHandle
Public Sub New (initialState As Boolean, mode As EventResetMode, name As String, options As NamedWaitHandleOptions, ByRef createdNew As Boolean)

Parameter

initialState
Boolean

true zum Festlegen des Anfangszustands, der signalisiert wird, wenn das benannte Ereignis als Ergebnis dieses Aufrufs erstellt wird; false um ihn auf "nicht signaliert" festzulegen.

mode
EventResetMode

Einer der EventResetMode Werte, der bestimmt, ob das Ereignis automatisch oder manuell zurückgesetzt wird.

name
String

Der Name, wenn das Synchronisierungsobjekt für andere Prozesse freigegeben werden soll; null andernfalls oder eine leere Zeichenfolge. Bei dem Namen wird die Groß-/Kleinschreibung beachtet.

options
NamedWaitHandleOptions

Die Bereichsoptionen für den benannten Handle. Standardmäßig ist der Zugriff auf den aktuellen Benutzer und die aktuelle Sitzung beschränkt. Die angegebenen Optionen können sich auf den Namespace für den Namen und den Zugriff auf das zugrunde liegende Handle-Objekt auswirken.

createdNew
Boolean

Wenn diese Methode zurückgegeben wird, enthält true , ob ein lokales Ereignis erstellt wurde (d. h. wenn name es sich um eine leere Zeichenfolge handelt null ) oder wenn das angegebene benannte Systemereignis erstellt wurde; enthält, false ob das angegebene benannte Systemereignis bereits vorhanden ist. Dieser Parameter wird nicht initialisiert übergeben.

Ausnahmen

name ist ungültig. Dies kann aus verschiedenen Gründen sein, einschließlich einiger Einschränkungen, die vom Betriebssystem platziert werden können, z. B. ein unbekanntes Präfix oder ungültige Zeichen. Beachten Sie, dass bei namen und allgemeinen Präfixen "Global\" und "Local\" die Groß-/Kleinschreibung beachtet wird.

- oder -

Es gab einen anderen Fehler. Die HResult Eigenschaft kann weitere Informationen bereitstellen.

nur Windows: name einen unbekannten Namespace angegeben. Weitere Informationen finden Sie unter Objektnamen .

name ist zu lang. Längenbeschränkungen hängen möglicherweise vom Betriebssystem oder der Konfiguration ab.

Das benannte Ereignis ist vorhanden und verfügt über Zugriffssteuerungssicherheit, aber der Benutzer hat nicht FullControl.

Ein Synchronisierungsobjekt mit dem bereitgestellten name Objekt kann nicht erstellt werden. Ein Synchronisierungsobjekt eines anderen Typs hat möglicherweise denselben Namen.

- oder -

Ein Objekt mit dem angegebenen name Objekt ist vorhanden, die angegebenen options Sind jedoch nicht mit den Optionen des vorhandenen Objekts kompatibel.

Der mode Enumerationswert war außerhalb des zulässigen Bereichs.

Hinweise

Wenn ein name Synchronisierungsobjekt des angeforderten Typs bereits im Namespace vorhanden ist, wird das vorhandene Synchronisierungsobjekt geöffnet. Wenn options jedoch der Zugriff auf den aktuellen Benutzer beschränkt ist und das Synchronisierungsobjekt nicht kompatibel ist, wird ein WaitHandleCannotBeOpenedException Fehler ausgelöst. Wenn ein Synchronisierungsobjekt eines anderen Typs bereits im Namespace vorhanden ist, wird auch ein WaitHandleCannotBeOpenedException Fehler ausgelöst. Andernfalls wird ein neues Synchronisierungsobjekt erstellt.

Wenn bereits ein Systemereignis mit dem für den name Parameter angegebenen Namen vorhanden ist, wird der initialState Parameter ignoriert. Verwenden Sie nach dem Aufrufen dieses Konstruktors den Wert in der variablen, die für den Parameter ref (parameter ByRef in Visual Basic) createdNew angegeben ist, um zu bestimmen, ob das benannte Systemereignis bereits vorhanden oder erstellt wurde.

Wenn der Anfangszustand des Ereignisses nicht signalisiert ist, werden Threads, die auf das Ereignis warten, blockiert. Wenn der anfängliche Zustand signalisiert ist und das ManualReset Flag für modeangegeben ist, werden Threads, die auf das Ereignis warten, nicht blockiert. Wenn der Anfangszustand signalisiert ist und mode ist AutoReset, wird der erste Thread, der auf das Ereignis wartet, sofort freigegeben, danach wird das Ereignis zurückgesetzt, und nachfolgende Threads werden blockiert.

Auf Windows können options bereitgestellt werden, um anzugeben, ob das benannte Systemereignis nur für den aktuellen Benutzer oder für alle Benutzer zugänglich ist. Außerdem können Sie angeben, ob auf das benannte Systemereignis nur für Prozesse in der aktuellen Sitzung oder für alle Sitzungen zugegriffen werden kann. Weitere Informationen finden Sie unter NamedWaitHandleOptions.

Vorsicht

Auf Unix-basierten Betriebssystemen wirkt sich der options Parameter nicht aus, da benannte Systemereignisse nicht unterstützt werden.

Weitere Informationen

Gilt für: