EventWaitHandle Constructors

Definitie

Initialiseert een nieuw exemplaar van de EventWaitHandle klasse.

Overloads

Name Description
EventWaitHandle(Boolean, EventResetMode)

Initialiseert een nieuw exemplaar van de EventWaitHandle klasse, waarbij wordt opgegeven of de wachtgreep in eerste instantie wordt gesignaleerd en of deze automatisch of handmatig opnieuw wordt ingesteld.

EventWaitHandle(Boolean, EventResetMode, String)

Initialiseert een nieuw exemplaar van de EventWaitHandle klasse, waarbij wordt opgegeven of de wachtgreep in eerste instantie wordt gesignaleerd als deze wordt gemaakt als gevolg van deze aanroep, of deze automatisch of handmatig opnieuw wordt ingesteld en de naam van een systeemsynchronisatiegebeurtenis.

EventWaitHandle(Boolean, EventResetMode, String, Boolean)

Initialiseert een nieuw exemplaar van de EventWaitHandle klasse, waarbij wordt opgegeven of de wachtgreep in eerste instantie wordt gesignaleerd als deze wordt gemaakt als gevolg van deze aanroep, of deze automatisch of handmatig opnieuw wordt ingesteld, de naam van een systeemsynchronisatiegebeurtenis en een Booleaanse variabele waarvan de waarde na de aanroep aangeeft of de benoemde systeemgebeurtenis is gemaakt.

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

Initialiseert een nieuw exemplaar van de EventWaitHandle klasse, waarbij wordt opgegeven of de wachtgreep in eerste instantie wordt gesignaleerd als deze wordt gemaakt als gevolg van deze aanroep, of deze automatisch of handmatig opnieuw wordt ingesteld, de naam van een systeemsynchronisatiegebeurtenis, een Booleaanse variabele waarvan de waarde na de aanroep aangeeft of de benoemde systeemgebeurtenis is gemaakt, en de beveiliging voor toegangsbeheer die moet worden toegepast op de benoemde gebeurtenis als deze wordt gemaakt.

EventWaitHandle(Boolean, EventResetMode)

Initialiseert een nieuw exemplaar van de EventWaitHandle klasse, waarbij wordt opgegeven of de wachtgreep in eerste instantie wordt gesignaleerd en of deze automatisch of handmatig opnieuw wordt ingesteld.

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)

Parameters

initialState
Boolean

true om de initiële status in te stellen op gesignaleerd; false om deze in te stellen op niet-ondertekend.

mode
EventResetMode

Een van de EventResetMode waarden die bepalen of de gebeurtenis automatisch of handmatig opnieuw wordt ingesteld.

Uitzonderingen

De mode opsommingswaarde was buiten het juridische bereik.

Voorbeelden

In het volgende codevoorbeeld wordt de overbelasting van de SignalAndWait(WaitHandle, WaitHandle) methode gebruikt om de hoofdthread een geblokkeerde thread te laten signaleren en vervolgens te wachten totdat de thread een taak heeft voltooid.

In het voorbeeld worden vijf threads gestart en kunnen ze blokkeren op een EventWaitHandle gemaakt met de EventResetMode.AutoReset vlag, waarna er telkens één thread wordt uitgebracht wanneer de gebruiker op de Enter-toets drukt. In het voorbeeld worden vervolgens nog vijf threads in de wachtrij geplaatst en worden ze allemaal vrijgegeven met behulp van een EventWaitHandle gemaakt met de EventResetMode.ManualReset vlag.

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

Opmerkingen

Als de initiële status van de gebeurtenis niet-ondertekend is, worden threads die wachten op de gebeurtenis geblokkeerd. Als de initiële status wordt gesignaleerd en de ManualReset vlag wordt opgegeven voor mode, worden threads die wachten op de gebeurtenis niet geblokkeerd. Als de initiële status wordt gesignaleerd en mode is AutoReset, wordt de eerste thread die op de gebeurtenis wacht onmiddellijk vrijgegeven, waarna de gebeurtenis opnieuw wordt ingesteld en volgende threads worden geblokkeerd.

Zie ook

Van toepassing op

EventWaitHandle(Boolean, EventResetMode, String)

Initialiseert een nieuw exemplaar van de EventWaitHandle klasse, waarbij wordt opgegeven of de wachtgreep in eerste instantie wordt gesignaleerd als deze wordt gemaakt als gevolg van deze aanroep, of deze automatisch of handmatig opnieuw wordt ingesteld en de naam van een systeemsynchronisatiegebeurtenis.

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);
[<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)

Parameters

initialState
Boolean

true om de initiële status in te stellen op gesignaleerd als de benoemde gebeurtenis wordt gemaakt als gevolg van deze aanroep; false om deze in te stellen op niet-ondertekend.

mode
EventResetMode

Een van de EventResetMode waarden die bepalen of de gebeurtenis automatisch of handmatig opnieuw wordt ingesteld.

name
String

De naam, als het synchronisatieobject moet worden gedeeld met andere processen; anders of null een lege tekenreeks. De naam is hoofdlettergevoelig. Het backslashteken (\) is gereserveerd en kan alleen worden gebruikt om een naamruimte op te geven. Zie de sectie Opmerkingen voor meer informatie over naamruimten. Er zijn mogelijk verdere beperkingen voor de naam, afhankelijk van het besturingssysteem. Op Unix-besturingssystemen moet de naam na het uitsluiten van de naamruimte bijvoorbeeld een geldige bestandsnaam zijn.

Kenmerken

Uitzonderingen

name is ongeldig. Dit kan om verschillende redenen zijn, waaronder enkele beperkingen die mogelijk door het besturingssysteem worden geplaatst, zoals een onbekend voorvoegsel of ongeldige tekens. Houd er rekening mee dat de naam en algemene voorvoegsels 'Global\' en 'Local\' hoofdlettergevoelig zijn.

– of –

Er is een andere fout opgetreden. De HResult eigenschap biedt mogelijk meer informatie.

alleen Windows: name een onbekende naamruimte opgegeven. Zie Objectnamen voor meer informatie.

Het name is te lang. Lengtebeperkingen kunnen afhankelijk zijn van het besturingssysteem of de configuratie.

De benoemde gebeurtenis bestaat en heeft beveiliging voor toegangsbeheer, maar de gebruiker heeft FullControlgeen .

Een synchronisatieobject met de opgegeven name kan niet worden gemaakt. Een synchronisatieobject van een ander type kan dezelfde naam hebben.

De mode opsommingswaarde was buiten het juridische bereik.

– of –

alleen .NET Framework: name is langer dan MAX_PATH (260 tekens).

Opmerkingen

De name naamruimte kan worden voorafgegaan door Global\ of Local\ om een naamruimte op te geven. Wanneer de Global naamruimte is opgegeven, kan het synchronisatieobject worden gedeeld met processen op het systeem. Wanneer de Local naamruimte is opgegeven, wat ook de standaardwaarde is wanneer er geen naamruimte is opgegeven, kan het synchronisatieobject worden gedeeld met processen in dezelfde sessie. Op Windows is een sessie een aanmeldingssessie en worden services meestal uitgevoerd in een andere niet-interactieve sessie. Op Unix-achtige besturingssystemen heeft elke shell een eigen sessie. Sessie-lokale synchronisatieobjecten zijn mogelijk geschikt voor het synchroniseren tussen processen met een bovenliggende/onderliggende relatie waar ze allemaal in dezelfde sessie worden uitgevoerd. Zie Objectnamen voor meer informatie over de namen van synchronisatieobjecten in Windows.

Als er een name is opgegeven en er al een synchronisatieobject van het aangevraagde type bestaat in de naamruimte, wordt het bestaande synchronisatieobject geopend. Als er al een synchronisatieobject van een ander type bestaat in de naamruimte, wordt er een WaitHandleCannotBeOpenedException gegenereerd. Anders wordt er een nieuw synchronisatieobject gemaakt.

Als er al een systeemgebeurtenis met de naam die is opgegeven voor de name parameter bestaat, wordt de initialState parameter genegeerd.

Caution

Standaard is een benoemde gebeurtenis niet beperkt tot de gebruiker die deze heeft gemaakt. Andere gebruikers kunnen de gebeurtenis mogelijk openen en gebruiken, waaronder het verstoren van de gebeurtenis door deze in te stellen of ongepast opnieuw in te stellen. Als u de toegang tot specifieke gebruikers wilt beperken, kunt u een overbelasting van een constructor gebruiken of EventWaitHandleAcl een constructor doorgeven EventWaitHandleSecurity bij het maken van de benoemde gebeurtenis. Vermijd het gebruik van benoemde gebeurtenissen zonder toegangsbeperkingen voor systemen waarop mogelijk niet-vertrouwde gebruikers code uitvoeren.

Important

Wanneer u deze constructor gebruikt voor benoemde systeem gebeurtenissen, geeft u op false voor initialState. Deze constructor biedt geen manier om te bepalen of er een benoemde systeemgebeurtenis is gemaakt, dus u kunt geen veronderstellingen maken over de status van de benoemde gebeurtenis. Gebruik de EventWaitHandle(Boolean, EventResetMode, String, Boolean) constructor of de EventWaitHandle(Boolean, EventResetMode, String, Boolean, EventWaitHandleSecurity) constructor om te bepalen of er een benoemde gebeurtenis is gemaakt.

Als de initiële status van de gebeurtenis niet-ondertekend is, worden threads die wachten op de gebeurtenis geblokkeerd. Als de initiële status wordt gesignaleerd en de ManualReset vlag wordt opgegeven voor mode, worden threads die wachten op de gebeurtenis niet geblokkeerd. Als de initiële status wordt gesignaleerd en mode is AutoReset, wordt de eerste thread die op de gebeurtenis wacht onmiddellijk vrijgegeven, waarna de gebeurtenis opnieuw wordt ingesteld en volgende threads worden geblokkeerd.

Zie ook

Van toepassing op

EventWaitHandle(Boolean, EventResetMode, String, Boolean)

Initialiseert een nieuw exemplaar van de EventWaitHandle klasse, waarbij wordt opgegeven of de wachtgreep in eerste instantie wordt gesignaleerd als deze wordt gemaakt als gevolg van deze aanroep, of deze automatisch of handmatig opnieuw wordt ingesteld, de naam van een systeemsynchronisatiegebeurtenis en een Booleaanse variabele waarvan de waarde na de aanroep aangeeft of de benoemde systeemgebeurtenis is gemaakt.

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);
[<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)

Parameters

initialState
Boolean

true om de initiële status in te stellen op gesignaleerd als de benoemde gebeurtenis wordt gemaakt als gevolg van deze aanroep; false om deze in te stellen op niet-ondertekend.

mode
EventResetMode

Een van de EventResetMode waarden die bepalen of de gebeurtenis automatisch of handmatig opnieuw wordt ingesteld.

name
String

De naam, als het synchronisatieobject moet worden gedeeld met andere processen; anders of null een lege tekenreeks. De naam is hoofdlettergevoelig. Het backslashteken (\) is gereserveerd en kan alleen worden gebruikt om een naamruimte op te geven. Zie de sectie Opmerkingen voor meer informatie over naamruimten. Er zijn mogelijk verdere beperkingen voor de naam, afhankelijk van het besturingssysteem. Op Unix-besturingssystemen moet de naam na het uitsluiten van de naamruimte bijvoorbeeld een geldige bestandsnaam zijn.

createdNew
Boolean

Wanneer deze methode wordt geretourneerd, bevat dit true als er een lokale gebeurtenis is gemaakt (dat wil gezegd, of namenull een lege tekenreeks) of als de opgegeven benoemde systeemgebeurtenis is gemaakt. false Als de opgegeven benoemde systeemgebeurtenis al bestaat. Deze parameter wordt niet-geïnitialiseerd doorgegeven.

Kenmerken

Uitzonderingen

name is ongeldig. Dit kan om verschillende redenen zijn, waaronder enkele beperkingen die mogelijk door het besturingssysteem worden geplaatst, zoals een onbekend voorvoegsel of ongeldige tekens. Houd er rekening mee dat de naam en algemene voorvoegsels 'Global\' en 'Local\' hoofdlettergevoelig zijn.

– of –

Er is een andere fout opgetreden. De HResult eigenschap biedt mogelijk meer informatie.

alleen Windows: name een onbekende naamruimte opgegeven. Zie Objectnamen voor meer informatie.

Het name is te lang. Lengtebeperkingen kunnen afhankelijk zijn van het besturingssysteem of de configuratie.

De benoemde gebeurtenis bestaat en heeft beveiliging voor toegangsbeheer, maar de gebruiker heeft FullControlgeen .

Een synchronisatieobject met de opgegeven name kan niet worden gemaakt. Een synchronisatieobject van een ander type kan dezelfde naam hebben.

De mode opsommingswaarde was buiten het juridische bereik.

– of –

alleen .NET Framework: name is langer dan MAX_PATH (260 tekens).

Opmerkingen

De name naamruimte kan worden voorafgegaan door Global\ of Local\ om een naamruimte op te geven. Wanneer de Global naamruimte is opgegeven, kan het synchronisatieobject worden gedeeld met processen op het systeem. Wanneer de Local naamruimte is opgegeven, wat ook de standaardwaarde is wanneer er geen naamruimte is opgegeven, kan het synchronisatieobject worden gedeeld met processen in dezelfde sessie. Op Windows is een sessie een aanmeldingssessie en worden services meestal uitgevoerd in een andere niet-interactieve sessie. Op Unix-achtige besturingssystemen heeft elke shell een eigen sessie. Sessie-lokale synchronisatieobjecten zijn mogelijk geschikt voor het synchroniseren tussen processen met een bovenliggende/onderliggende relatie waar ze allemaal in dezelfde sessie worden uitgevoerd. Zie Objectnamen voor meer informatie over de namen van synchronisatieobjecten in Windows.

Als er een name is opgegeven en er al een synchronisatieobject van het aangevraagde type bestaat in de naamruimte, wordt het bestaande synchronisatieobject geopend. Als er al een synchronisatieobject van een ander type bestaat in de naamruimte, wordt er een WaitHandleCannotBeOpenedException gegenereerd. Anders wordt er een nieuw synchronisatieobject gemaakt.

Als er al een systeemgebeurtenis met de naam die is opgegeven voor de name parameter bestaat, wordt de initialState parameter genegeerd. Nadat u deze constructor hebt aangeroepen, gebruikt u de waarde in de variabele die is opgegeven voor de parameter ref (ByRef parameter in Visual Basic)createdNew om te bepalen of de benoemde systeemgebeurtenis al bestond of is gemaakt.

Als de initiële status van de gebeurtenis niet-ondertekend is, worden threads die wachten op de gebeurtenis geblokkeerd. Als de initiële status wordt gesignaleerd en de ManualReset vlag wordt opgegeven voor mode, worden threads die wachten op de gebeurtenis niet geblokkeerd. Als de initiële status wordt gesignaleerd en mode is AutoReset, wordt de eerste thread die op de gebeurtenis wacht onmiddellijk vrijgegeven, waarna de gebeurtenis opnieuw wordt ingesteld en volgende threads worden geblokkeerd.

Caution

Standaard is een benoemde gebeurtenis niet beperkt tot de gebruiker die deze heeft gemaakt. Andere gebruikers kunnen de gebeurtenis mogelijk openen en gebruiken, waaronder het verstoren van de gebeurtenis door deze in te stellen of ongepast opnieuw in te stellen. Als u de toegang tot specifieke gebruikers wilt beperken, kunt u een overbelasting van een constructor gebruiken of EventWaitHandleAcl een constructor doorgeven EventWaitHandleSecurity bij het maken van de benoemde gebeurtenis. Vermijd het gebruik van benoemde gebeurtenissen zonder toegangsbeperkingen voor systemen waarop mogelijk niet-vertrouwde gebruikers code uitvoeren.

Zie ook

Van toepassing op

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

Initialiseert een nieuw exemplaar van de EventWaitHandle klasse, waarbij wordt opgegeven of de wachtgreep in eerste instantie wordt gesignaleerd als deze wordt gemaakt als gevolg van deze aanroep, of deze automatisch of handmatig opnieuw wordt ingesteld, de naam van een systeemsynchronisatiegebeurtenis, een Booleaanse variabele waarvan de waarde na de aanroep aangeeft of de benoemde systeemgebeurtenis is gemaakt, en de beveiliging voor toegangsbeheer die moet worden toegepast op de benoemde gebeurtenis als deze wordt gemaakt.

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)

Parameters

initialState
Boolean

true om de initiële status in te stellen op gesignaleerd als de benoemde gebeurtenis wordt gemaakt als gevolg van deze aanroep; false om deze in te stellen op niet-ondertekend.

mode
EventResetMode

Een van de EventResetMode waarden die bepalen of de gebeurtenis automatisch of handmatig opnieuw wordt ingesteld.

name
String

De naam, als het synchronisatieobject moet worden gedeeld met andere processen; anders of null een lege tekenreeks. De naam is hoofdlettergevoelig. Het backslashteken (\) is gereserveerd en kan alleen worden gebruikt om een naamruimte op te geven. Zie de sectie Opmerkingen voor meer informatie over naamruimten. Er zijn mogelijk verdere beperkingen voor de naam, afhankelijk van het besturingssysteem. Op Unix-besturingssystemen moet de naam na het uitsluiten van de naamruimte bijvoorbeeld een geldige bestandsnaam zijn.

createdNew
Boolean

Wanneer deze methode wordt geretourneerd, bevat dit true als er een lokale gebeurtenis is gemaakt (dat wil gezegd, of namenull een lege tekenreeks) of als de opgegeven benoemde systeemgebeurtenis is gemaakt. false Als de opgegeven benoemde systeemgebeurtenis al bestaat. Deze parameter wordt niet-geïnitialiseerd doorgegeven.

eventSecurity
EventWaitHandleSecurity

Een EventWaitHandleSecurity object dat de beveiliging van toegangsbeheer vertegenwoordigt die moet worden toegepast op de benoemde systeem gebeurtenis.

Kenmerken

Uitzonderingen

name is ongeldig. Dit kan om verschillende redenen zijn, waaronder enkele beperkingen die mogelijk door het besturingssysteem worden geplaatst, zoals een onbekend voorvoegsel of ongeldige tekens. Houd er rekening mee dat de naam en algemene voorvoegsels 'Global\' en 'Local\' hoofdlettergevoelig zijn.

– of –

Er is een andere fout opgetreden. De HResult eigenschap biedt mogelijk meer informatie.

alleen Windows: name een onbekende naamruimte opgegeven. Zie Objectnamen voor meer informatie.

Het name is te lang. Lengtebeperkingen kunnen afhankelijk zijn van het besturingssysteem of de configuratie.

De benoemde gebeurtenis bestaat en heeft beveiliging voor toegangsbeheer, maar de gebruiker heeft FullControlgeen .

Een synchronisatieobject met de opgegeven name kan niet worden gemaakt. Een synchronisatieobject van een ander type kan dezelfde naam hebben.

De mode opsommingswaarde was buiten het juridische bereik.

– of –

alleen .NET Framework: name is langer dan MAX_PATH (260 tekens).

Voorbeelden

In het volgende codevoorbeeld ziet u het gedrag tussen processen van een benoemde systeemgebeurtenis met beveiliging voor toegangsbeheer. In het voorbeeld wordt de overbelasting van de OpenExisting(String) methode gebruikt om te testen op het bestaan van een benoemde gebeurtenis.

Als de gebeurtenis niet bestaat, wordt deze gemaakt met de eerste eigendoms- en toegangsbeheerbeveiliging die de huidige gebruiker het recht weigert om de gebeurtenis te gebruiken, maar verleent het recht om machtigingen voor de gebeurtenis te lezen en te wijzigen.

Als u het gecompileerde voorbeeld uitvoert vanuit twee opdrachtvensters, genereert de tweede kopie een uitzondering voor toegangsschending bij de aanroep naar OpenExisting(String). De uitzondering wordt gevangen en in het voorbeeld wordt de overbelasting van de OpenExisting(String, EventWaitHandleRights) methode gebruikt om te wachten op de gebeurtenis met de rechten die nodig zijn om de machtigingen te lezen en te wijzigen.

Nadat de machtigingen zijn gewijzigd, wordt de gebeurtenis geopend met de rechten die nodig zijn om erop te wachten en deze aan te geven. Als u het gecompileerde voorbeeld uitvoert vanuit een derde opdrachtvenster, wordt het voorbeeld uitgevoerd met behulp van de nieuwe machtigingen.

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

Opmerkingen

Gebruik deze constructor om de beveiliging van toegangsbeheer toe te passen op een benoemde systeem gebeurtenis wanneer deze wordt gemaakt, zodat andere code de controle over de gebeurtenis kan overnemen.

Met deze constructor wordt een EventWaitHandle object geïnitialiseerd dat een systeem gebeurtenis vertegenwoordigt. U kunt meerdere EventWaitHandle objecten maken die dezelfde systeem gebeurtenis vertegenwoordigen.

Als de systeem gebeurtenis niet bestaat, wordt deze gemaakt met de opgegeven beveiliging voor toegangsbeheer. Als de gebeurtenis bestaat, wordt de opgegeven beveiliging voor toegangsbeheer genegeerd.

Note

De aanroeper heeft volledige controle over het zojuist gemaakte EventWaitHandle object, zelfs als eventSecurity bepaalde toegangsrechten voor de huidige gebruiker worden geweigerd of mislukt. Als de huidige gebruiker echter een andere EventWaitHandle-object probeert te verkrijgen om dezelfde benoemde gebeurtenis weer te geven, wordt er een constructor of de methode OpenExisting toegepast Windows beveiliging voor toegangsbeheer.

De name naamruimte kan worden voorafgegaan door Global\ of Local\ om een naamruimte op te geven. Wanneer de Global naamruimte is opgegeven, kan het synchronisatieobject worden gedeeld met processen op het systeem. Wanneer de Local naamruimte is opgegeven, wat ook de standaardwaarde is wanneer er geen naamruimte is opgegeven, kan het synchronisatieobject worden gedeeld met processen in dezelfde sessie. Op Windows is een sessie een aanmeldingssessie en worden services meestal uitgevoerd in een andere niet-interactieve sessie. Op Unix-achtige besturingssystemen heeft elke shell een eigen sessie. Sessie-lokale synchronisatieobjecten zijn mogelijk geschikt voor het synchroniseren tussen processen met een bovenliggende/onderliggende relatie waar ze allemaal in dezelfde sessie worden uitgevoerd. Zie Objectnamen voor meer informatie over de namen van synchronisatieobjecten in Windows.

Als er een name is opgegeven en er al een synchronisatieobject van het aangevraagde type bestaat in de naamruimte, wordt het bestaande synchronisatieobject geopend. Als er al een synchronisatieobject van een ander type bestaat in de naamruimte, wordt er een WaitHandleCannotBeOpenedException gegenereerd. Anders wordt er een nieuw synchronisatieobject gemaakt.

Als er al een systeemgebeurtenis met de naam die is opgegeven voor de name parameter bestaat, wordt de initialState parameter genegeerd. Nadat u deze constructor hebt aangeroepen, gebruikt u de waarde in de variabele die is opgegeven voor de parameter ref (ByRef parameter in Visual Basic) createdNew om te bepalen of de benoemde systeemgebeurtenis al bestond of is gemaakt.

Als de initiële status van de gebeurtenis niet-ondertekend is, worden threads die wachten op de gebeurtenis geblokkeerd. Als de initiële status wordt gesignaleerd en de ManualReset vlag wordt opgegeven voor mode, worden threads die wachten op de gebeurtenis niet geblokkeerd. Als de initiële status wordt gesignaleerd en mode is AutoReset, wordt de eerste thread die op de gebeurtenis wacht onmiddellijk vrijgegeven, waarna de gebeurtenis opnieuw wordt ingesteld en volgende threads worden geblokkeerd.

Caution

Standaard is een benoemde gebeurtenis niet beperkt tot de gebruiker die deze heeft gemaakt. Andere gebruikers kunnen de gebeurtenis mogelijk openen en gebruiken, waaronder het verstoren van de gebeurtenis door deze in te stellen of ongepast opnieuw in te stellen. Als u de toegang tot specifieke gebruikers wilt beperken, kunt u een EventWaitHandleSecurity doorgeven bij het maken van de benoemde gebeurtenis. Vermijd het gebruik van benoemde gebeurtenissen zonder toegangsbeperkingen voor systemen waarop mogelijk niet-vertrouwde gebruikers code uitvoeren.

Zie ook

Van toepassing op