EventWaitHandle Klas

Definitie

Vertegenwoordigt een threadsynchronisatie-gebeurtenis.

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

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

De EventWaitHandle klasse stelt threads in staat om met elkaar te communiceren door te signaleren. Normaal gesproken wordt een of meer threads op een EventWaitHandle blok aangeroepen totdat een niet-geblokkeerde thread de Set methode aanroept, waarbij een of meer geblokkeerde threads worden vrijgegeven. Een thread kan een EventWaitHandle signaleren en vervolgens blokkeren door de methode static (Shared in Visual Basic) aan te roepen WaitHandle.SignalAndWait methode.

Note

De EventWaitHandle klasse biedt toegang tot benoemde systeemsynchronisatie-gebeurtenissen.

Het gedrag van een EventWaitHandle gesignaleerde is afhankelijk van de resetmodus. Een EventWaitHandle gemaakt met de EventResetMode.AutoReset vlag wordt automatisch opnieuw ingesteld wanneer deze wordt gesignaleerd, na het vrijgeven van één wachtende thread. Een EventWaitHandle gemaakt met de EventResetMode.ManualReset vlag blijft gesignaleerd totdat de Reset methode wordt aangeroepen.

Gebeurtenissen voor automatisch opnieuw instellen bieden exclusieve toegang tot een resource. Als een gebeurtenis voor automatisch opnieuw instellen wordt gesignaleerd wanneer er geen threads wachten, blijft deze gesignaleerd totdat een thread erop probeert te wachten. Met de gebeurtenis wordt de thread vrijgegeven en onmiddellijk opnieuw ingesteld, waardoor volgende threads worden geblokkeerd.

Handmatige reset-gebeurtenissen zijn net als poorten. Wanneer de gebeurtenis niet wordt gesignaleerd, worden threads die erop wachten geblokkeerd. Wanneer de gebeurtenis wordt gesignaleerd, worden alle wachtende threads vrijgegeven en blijft de gebeurtenis gesignaleerd (dat wil gezegd: daaropvolgende wachttijden worden niet geblokkeerd) totdat de Reset methode wordt aangeroepen. Handmatige reset-gebeurtenissen zijn handig wanneer een thread een activiteit moet voltooien voordat andere threads kunnen doorgaan.

EventWaitHandle-objecten kunnen worden gebruikt met de methoden static(Shared in Visual Basic) WaitHandle.WaitAll en WaitHandle.WaitAny.

Zie de sectie Thread-interactie of signaleringssectie van het artikel Overzicht van synchronisatieprimitief voor meer informatie.

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.

Constructors

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

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)

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.

Velden

Name Description
WaitTimeout

Geeft aan dat er een time-out optreedt voordat een WaitAny(WaitHandle[], Int32, Boolean) van de wachtgrepen is gesignaleerd. Dit veld is constant.

(Overgenomen van WaitHandle)

Eigenschappen

Name Description
Handle
Verouderd.

Hiermee haalt u de systeemeigen ingang van het besturingssysteem op of stelt u deze in.

(Overgenomen van WaitHandle)
SafeWaitHandle

Hiermee haalt u de systeemeigen ingang van het besturingssysteem op of stelt u deze in.

(Overgenomen van WaitHandle)

Methoden

Name Description
Close()

Alle resources die door de huidige WaitHandleresources worden bewaard, worden vrijgegeven.

(Overgenomen van WaitHandle)
CreateObjRef(Type)

Hiermee maakt u een object dat alle relevante informatie bevat die nodig is om een proxy te genereren die wordt gebruikt om te communiceren met een extern object.

(Overgenomen van MarshalByRefObject)
Dispose()

Alle resources die door het huidige exemplaar van de WaitHandle klasse worden gebruikt, worden vrijgegeven.

(Overgenomen van WaitHandle)
Dispose(Boolean)

Wanneer deze worden overschreven in een afgeleide klasse, worden de onbeheerde resources die door de WaitHandleklasse worden gebruikt, uitgebracht en worden de beheerde resources optioneel vrijgegeven.

(Overgenomen van WaitHandle)
Equals(Object)

Bepaalt of het opgegeven object gelijk is aan het huidige object.

(Overgenomen van Object)
GetAccessControl()

Hiermee haalt u een EventWaitHandleSecurity object op dat de beveiliging van toegangsbeheer vertegenwoordigt voor de benoemde systeem gebeurtenis die wordt vertegenwoordigd door het huidige EventWaitHandle object.

GetHashCode()

Fungeert als de standaardhashfunctie.

(Overgenomen van Object)
GetLifetimeService()

Hiermee haalt u het huidige levensduurserviceobject op waarmee het levensduurbeleid voor dit exemplaar wordt beheerd.

(Overgenomen van MarshalByRefObject)
GetType()

Hiermee haalt u de Type huidige instantie op.

(Overgenomen van Object)
InitializeLifetimeService()

Hiermee haalt u een levensduurserviceobject op om het levensduurbeleid voor dit exemplaar te beheren.

(Overgenomen van MarshalByRefObject)
MemberwiseClone()

Hiermee maakt u een ondiepe kopie van de huidige Object.

(Overgenomen van Object)
MemberwiseClone(Boolean)

Hiermee maakt u een ondiepe kopie van het huidige MarshalByRefObject object.

(Overgenomen van MarshalByRefObject)
OpenExisting(String, EventWaitHandleRights)

Hiermee opent u de opgegeven benoemde synchronisatie-gebeurtenis, als deze al bestaat, met de gewenste beveiligingstoegang.

OpenExisting(String)

Hiermee opent u de opgegeven benoemde synchronisatie-gebeurtenis, als deze al bestaat.

Reset()

Hiermee stelt u de status van de gebeurtenis in op niet-ondertekend, waardoor threads worden geblokkeerd.

Set()

Hiermee stelt u de status van de gebeurtenis in op signalering, zodat een of meer wachtthreads kunnen worden voortgezet.

SetAccessControl(EventWaitHandleSecurity)

Hiermee stelt u de beveiliging voor toegangsbeheer in voor een benoemde systeem gebeurtenis.

ToString()

Retourneert een tekenreeks die het huidige object vertegenwoordigt.

(Overgenomen van Object)
TryOpenExisting(String, EventWaitHandle)

Hiermee opent u de opgegeven benoemde synchronisatiegebeurtenis, als deze al bestaat en retourneert u een waarde die aangeeft of de bewerking is geslaagd.

TryOpenExisting(String, EventWaitHandleRights, EventWaitHandle)

Hiermee opent u de opgegeven benoemde synchronisatiegebeurtenis, als deze al bestaat, met de gewenste beveiligingstoegang en retourneert u een waarde die aangeeft of de bewerking is geslaagd.

WaitOne()

Hiermee blokkeert u de huidige thread totdat de stroom WaitHandle een signaal ontvangt.

(Overgenomen van WaitHandle)
WaitOne(Int32, Boolean)

Hiermee blokkeert u de huidige thread totdat de huidige WaitHandle een signaal ontvangt, met behulp van een 32-bits ondertekend geheel getal om het tijdsinterval op te geven en op te geven of het synchronisatiedomein moet worden afgesloten voordat de wacht wordt uitgevoerd.

(Overgenomen van WaitHandle)
WaitOne(Int32)

Hiermee blokkeert u de huidige thread totdat de huidige WaitHandle een signaal ontvangt, met behulp van een 32-bits ondertekend geheel getal om het tijdsinterval in milliseconden op te geven.

(Overgenomen van WaitHandle)
WaitOne(TimeSpan, Boolean)

Hiermee blokkeert u de huidige thread totdat het huidige exemplaar een signaal ontvangt, met behulp van een TimeSpan om het tijdsinterval op te geven en op te geven of het synchronisatiedomein moet worden afgesloten voordat de wacht wordt uitgevoerd.

(Overgenomen van WaitHandle)
WaitOne(TimeSpan)

Hiermee blokkeert u de huidige thread totdat het huidige exemplaar een signaal ontvangt met behulp van een TimeSpan signaal om het tijdsinterval op te geven.

(Overgenomen van WaitHandle)

Expliciete interface-implementaties

Name Description
IDisposable.Dispose()

Deze API ondersteunt de productinfrastructuur en is niet bedoeld om rechtstreeks vanuit de code te gebruiken.

Alle resources die worden gebruikt door de WaitHandle.

(Overgenomen van WaitHandle)

Extensiemethoden

Name Description
GetSafeWaitHandle(WaitHandle)

Hiermee haalt u de veilige ingang voor een systeemeigen wachtgreep van het besturingssysteem op.

SetSafeWaitHandle(WaitHandle, SafeWaitHandle)

Hiermee stelt u een veilige ingang in voor een systeemeigen wachtgreep voor het besturingssysteem.

Van toepassing op

Veiligheid thread

Dit type is thread veilig.

Zie ook