EventWaitHandle Classe

Definição

Representa um evento de sincronização de threads.

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
Herança
EventWaitHandle
Herança
Derivado
Atributos

Exemplos

O exemplo de código seguinte usa o SignalAndWait(WaitHandle, WaitHandle) método overload para permitir que o thread principal sinalize um thread bloqueado e depois espere até que o thread termine uma tarefa.

O exemplo inicia cinco threads e permite-lhes bloquear num EventWaitHandle criado com a EventResetMode.AutoReset flag, libertando depois um thread cada vez que o utilizador pressiona a tecla Enter . O exemplo coloca então mais cinco threads e liberta-os todos usando um EventWaitHandle created with the EventResetMode.ManualReset flag.

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

Observações

A EventWaitHandle classe permite que os threads comuniquem entre si através de sinalização. Normalmente, um ou mais threads bloqueiam num EventWaitHandle até que um thread desbloqueado chame o Set método, libertando um ou mais dos threads bloqueados. Uma thread pode sinalizar um EventWaitHandle e depois bloquear sobre ele, chamando o método static (Shared em Visual Basic) WaitHandle.SignalAndWait.

Note

A EventWaitHandle classe fornece acesso a eventos de sincronização de sistemas nomeados.

O comportamento de um EventWaitHandle que foi sinalizado depende do seu modo de reset. Um EventWaitHandle criado com a EventResetMode.AutoReset bandeira reinicia-se automaticamente quando sinalizado, após libertar um único thread em espera. Um EventWaitHandle criado com o sinalizador EventResetMode.ManualReset permanece sinalizado até que o seu método Reset seja chamado.

Eventos de reinício automático dão acesso exclusivo a um recurso. Se um evento de redefinição automática for sinalizado quando nenhum thread estiver à espera, ele permanecerá sinalizado até que um thread tente esperar por ele. O evento libera o thread, é imediatamente resetado, bloqueando os threads subsequentes.

Os eventos de reset manual são como portais. Quando o evento não é sinalizado, os threads que aguardam por ele bloqueiam-se. Quando o evento é sinalizado, todos os threads em espera são libertados, e o evento permanece sinalizado (ou seja, as esperas subsequentes não bloqueiam) até que o seu Reset método seja chamado. Eventos de reset manual são úteis quando um thread tem de completar uma atividade antes que outros threads possam avançar.

Os objetos EventWaitHandle podem ser usados com os métodos static(Shared em Visual Basic), WaitHandle.WaitAll e WaitHandle.WaitAny.

Para mais informações, consulte a secção Interação de Fios, ou sinalização do artigo Visão Geral das primitivas de sincronização .

Atenção

Por defeito, um evento nomeado não está restrito ao utilizador que o criou. Outros utilizadores podem conseguir abrir e usar o evento, incluindo interferir com o evento ao configurá-lo ou reiniciá-lo de forma inadequada. Para restringir o acesso a utilizadores específicos, pode usar um constructor overload ou EventWaitHandleAcl e passar um an EventWaitHandleSecurity ao criar o evento nomeado. Evite usar eventos nomeados sem restrições de acesso em sistemas que possam ter utilizadores não confiáveis a executar código.

Construtores

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

Inicializa uma nova instância da EventWaitHandle classe, especificando se o handle de espera é inicialmente sinalizado se criado como resultado desta chamada, se reinicia automaticamente ou manualmente, o nome de um evento de sincronização do sistema, uma variável booleana cujo valor após a chamada indica se o evento do sistema nomeado foi criado, e a segurança do controlo de acesso a ser aplicada ao evento nomeado caso este seja criado.

EventWaitHandle(Boolean, EventResetMode, String, Boolean)

Inicializa uma nova instância da EventWaitHandle classe, especificando se o handle de espera é inicialmente sinalizado se criado como resultado desta chamada, se reinicia automaticamente ou manualmente, o nome de um evento de sincronização do sistema, e uma variável booleana cujo valor após a chamada indica se o evento do sistema nomeado foi criado.

EventWaitHandle(Boolean, EventResetMode, String)

Inicializa uma nova instância da EventWaitHandle classe, especificando se o handle de espera é inicialmente sinalizado se criado como resultado desta chamada, se reinicia automaticamente ou manualmente, e o nome de um evento de sincronização do sistema.

EventWaitHandle(Boolean, EventResetMode)

Inicializa uma nova instância da EventWaitHandle classe, especificando se o handle de espera é inicialmente sinalizado e se reinicia automaticamente ou manualmente.

Campos

Name Description
WaitTimeout

Indica que uma WaitAny(WaitHandle[], Int32, Boolean) operação terminou antes de qualquer uma das alças de espera ser sinalizada. Este campo é constante.

(Herdado de WaitHandle)

Propriedades

Name Description
Handle
Obsoleto.

Obtém ou define o handle nativo do sistema operativo.

(Herdado de WaitHandle)
SafeWaitHandle

Obtém ou define o handle nativo do sistema operativo.

(Herdado de WaitHandle)

Métodos

Name Description
Close()

Liberta todos os recursos detidos pelo atual WaitHandle.

(Herdado de WaitHandle)
CreateObjRef(Type)

Cria um objeto que contém toda a informação relevante necessária para gerar um proxy usado para comunicar com um objeto remoto.

(Herdado de MarshalByRefObject)
Dispose()

Liberta todos os recursos usados pela instância atual da WaitHandle classe.

(Herdado de WaitHandle)
Dispose(Boolean)

Quando sobreposto numa classe derivada, liberta os recursos não geridos usados pelo WaitHandle, e opcionalmente liberta os recursos geridos.

(Herdado de WaitHandle)
Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.

(Herdado de Object)
GetAccessControl()

Obtém um EventWaitHandleSecurity objeto que representa a segurança do controlo de acesso para o evento do sistema nomeado representado pelo objeto atual EventWaitHandle .

GetHashCode()

Serve como função de hash predefinida.

(Herdado de Object)
GetLifetimeService()

Recupera o objeto de serviço de tempo de vida atual que controla a política de vida útil neste caso.

(Herdado de MarshalByRefObject)
GetType()

Obtém o Type da instância atual.

(Herdado de Object)
InitializeLifetimeService()

Obtém-se um objeto de serviço vitalício para controlar a apólice vitalícia neste caso.

(Herdado de MarshalByRefObject)
MemberwiseClone()

Cria uma cópia superficial do atual Object.

(Herdado de Object)
MemberwiseClone(Boolean)

Cria uma cópia superficial do objeto atual MarshalByRefObject .

(Herdado de MarshalByRefObject)
OpenExisting(String, EventWaitHandleRights)

Abre o evento de sincronização especificado com nome, se já existir, com o acesso de segurança desejado.

OpenExisting(String)

Abre o evento de sincronização especificado, se já existir.

Reset()

Define o estado do evento como não sinalizado, fazendo com que os fios fiquem bloqueados.

Set()

Define o estado do evento para sinalizado, permitindo que um ou mais threads em espera prossigam.

SetAccessControl(EventWaitHandleSecurity)

Define a segurança do controlo de acesso para um evento do sistema nomeado.

ToString()

Devolve uma cadeia que representa o objeto atual.

(Herdado de Object)
TryOpenExisting(String, EventWaitHandle)

Abre o evento de sincronização nomeado especificado, se já existir, e devolve um valor que indica se a operação foi bem-sucedida.

TryOpenExisting(String, EventWaitHandleRights, EventWaitHandle)

Abre o evento de sincronização nomeado especificado, se já existir, com o acesso de segurança desejado, e devolve um valor que indica se a operação teve sucesso.

WaitOne()

Bloqueia a linha de corrente até que a corrente WaitHandle receba um sinal.

(Herdado de WaitHandle)
WaitOne(Int32, Boolean)

Bloqueia o thread atual até que a corrente WaitHandle receba um sinal, usando um inteiro assinado de 32 bits para especificar o intervalo de tempo e especificando se deve sair do domínio de sincronização antes da espera.

(Herdado de WaitHandle)
WaitOne(Int32)

Bloqueia a thread da corrente até que a corrente WaitHandle receba um sinal, usando um inteiro assinado de 32 bits para especificar o intervalo de tempo em milissegundos.

(Herdado de WaitHandle)
WaitOne(TimeSpan, Boolean)

Bloqueia o thread atual até que a instância atual receba um sinal, usando a TimeSpan para especificar o intervalo de tempo e especificando se deve sair do domínio de sincronização antes da espera.

(Herdado de WaitHandle)
WaitOne(TimeSpan)

Bloqueia o thread atual até que a instância atual receba um sinal, usando a TimeSpan para especificar o intervalo de tempo.

(Herdado de WaitHandle)

Implementações de Interface Explícita

Name Description
IDisposable.Dispose()

Esta API suporta a infraestrutura de produtos e não é pressuposta para ser utilizada diretamente a partir do seu código.

Liberta todos os recursos utilizados pelo WaitHandle.

(Herdado de WaitHandle)

Métodos da Extensão

Name Description
GetSafeWaitHandle(WaitHandle)

Obtém o handle seguro para um handle de espera nativo do sistema operativo.

SetSafeWaitHandle(WaitHandle, SafeWaitHandle)

Define um handle seguro para um handle de espera nativo do sistema operativo.

Aplica-se a

Segurança de Thread

Este tipo é seguro para fios.

Ver também