AutoResetEvent Classe

Definição

Representa um evento de sincronização de threads que, quando sinalizado, liberta uma única thread em espera e depois reinicia automaticamente. Esta classe não pode ser herdada.

public ref class AutoResetEvent sealed : System::Threading::EventWaitHandle
public ref class AutoResetEvent sealed : System::Threading::WaitHandle
public sealed class AutoResetEvent : System.Threading.EventWaitHandle
public sealed class AutoResetEvent : System.Threading.WaitHandle
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class AutoResetEvent : System.Threading.EventWaitHandle
type AutoResetEvent = class
    inherit EventWaitHandle
type AutoResetEvent = class
    inherit WaitHandle
[<System.Runtime.InteropServices.ComVisible(true)>]
type AutoResetEvent = class
    inherit EventWaitHandle
Public NotInheritable Class AutoResetEvent
Inherits EventWaitHandle
Public NotInheritable Class AutoResetEvent
Inherits WaitHandle
Herança
Herança
Herança
Atributos

Exemplos

O exemplo seguinte mostra como usar AutoResetEvent para libertar um thread de cada vez, chamando o Set método (na classe base) cada vez que o utilizador pressiona a tecla Enter . O exemplo inicia três threads, que esperam por um AutoResetEvent que foi criado no estado sinalizado. O primeiro thread é libertado imediatamente, porque o AutoResetEvent já está no estado sinalizado. Isto reinicia o AutoResetEvent para o estado não sinalizado, de modo que os threads subsequentes bloqueiam. Os threads bloqueados não são libertados até que o utilizador os liberte um a um, pressionando a tecla Enter .

Depois de os fios serem libertados do primeiro AutoResetEvent, esperam por outro AutoResetEvent que foi criado no estado não sinalizado. Os três threads bloqueiam, por isso o Set método tem de ser chamado três vezes para libertar todos.

using System;
using System.Threading;

// Visual Studio: Replace the default class in a Console project with 
//                the following class.
class Example
{
    private static AutoResetEvent event_1 = new AutoResetEvent(true);
    private static AutoResetEvent event_2 = new AutoResetEvent(false);

    static void Main()
    {
        Console.WriteLine("Press Enter to create three threads and start them.\r\n" +
                          "The threads wait on AutoResetEvent #1, which was created\r\n" +
                          "in the signaled state, so the first thread is released.\r\n" +
                          "This puts AutoResetEvent #1 into the unsignaled state.");
        Console.ReadLine();
            
        for (int i = 1; i < 4; i++)
        {
            Thread t = new Thread(ThreadProc);
            t.Name = "Thread_" + i;
            t.Start();
        }
        Thread.Sleep(250);

        for (int i = 0; i < 2; i++)
        {
            Console.WriteLine("Press Enter to release another thread.");
            Console.ReadLine();
            event_1.Set();
            Thread.Sleep(250);
        }

        Console.WriteLine("\r\nAll threads are now waiting on AutoResetEvent #2.");
        for (int i = 0; i < 3; i++)
        {
            Console.WriteLine("Press Enter to release a thread.");
            Console.ReadLine();
            event_2.Set();
            Thread.Sleep(250);
        }

        // Visual Studio: Uncomment the following line.
        //Console.Readline();
    }

    static void ThreadProc()
    {
        string name = Thread.CurrentThread.Name;

        Console.WriteLine("{0} waits on AutoResetEvent #1.", name);
        event_1.WaitOne();
        Console.WriteLine("{0} is released from AutoResetEvent #1.", name);

        Console.WriteLine("{0} waits on AutoResetEvent #2.", name);
        event_2.WaitOne();
        Console.WriteLine("{0} is released from AutoResetEvent #2.", name);

        Console.WriteLine("{0} ends.", name);
    }
}

/* This example produces output similar to the following:

Press Enter to create three threads and start them.
The threads wait on AutoResetEvent #1, which was created
in the signaled state, so the first thread is released.
This puts AutoResetEvent #1 into the unsignaled state.

Thread_1 waits on AutoResetEvent #1.
Thread_1 is released from AutoResetEvent #1.
Thread_1 waits on AutoResetEvent #2.
Thread_3 waits on AutoResetEvent #1.
Thread_2 waits on AutoResetEvent #1.
Press Enter to release another thread.

Thread_3 is released from AutoResetEvent #1.
Thread_3 waits on AutoResetEvent #2.
Press Enter to release another thread.

Thread_2 is released from AutoResetEvent #1.
Thread_2 waits on AutoResetEvent #2.

All threads are now waiting on AutoResetEvent #2.
Press Enter to release a thread.

Thread_2 is released from AutoResetEvent #2.
Thread_2 ends.
Press Enter to release a thread.

Thread_1 is released from AutoResetEvent #2.
Thread_1 ends.
Press Enter to release a thread.

Thread_3 is released from AutoResetEvent #2.
Thread_3 ends.
 */
Imports System.Threading

' Visual Studio: Replace the default class in a Console project with 
'                the following class.
Class Example

    Private Shared event_1 As New AutoResetEvent(True)
    Private Shared event_2 As New AutoResetEvent(False)

    <MTAThread()> _
    Shared Sub Main()
    
        Console.WriteLine("Press Enter to create three threads and start them." & vbCrLf & _
                          "The threads wait on AutoResetEvent #1, which was created" & vbCrLf & _
                          "in the signaled state, so the first thread is released." & vbCrLf & _
                          "This puts AutoResetEvent #1 into the unsignaled state.")
        Console.ReadLine()
            
        For i As Integer = 1 To 3
            Dim t As New Thread(AddressOf ThreadProc)
            t.Name = "Thread_" & i
            t.Start()
        Next
        Thread.Sleep(250)

        For i As Integer = 1 To 2
            Console.WriteLine("Press Enter to release another thread.")
            Console.ReadLine()

            event_1.Set()
            Thread.Sleep(250)
        Next

        Console.WriteLine(vbCrLf & "All threads are now waiting on AutoResetEvent #2.")
        For i As Integer = 1 To 3
            Console.WriteLine("Press Enter to release a thread.")
            Console.ReadLine()

            event_2.Set()
            Thread.Sleep(250)
        Next

        ' Visual Studio: Uncomment the following line.
        'Console.Readline()
    End Sub

    Shared Sub ThreadProc()
    
        Dim name As String = Thread.CurrentThread.Name

        Console.WriteLine("{0} waits on AutoResetEvent #1.", name)
        event_1.WaitOne()
        Console.WriteLine("{0} is released from AutoResetEvent #1.", name)

        Console.WriteLine("{0} waits on AutoResetEvent #2.", name)
        event_2.WaitOne()
        Console.WriteLine("{0} is released from AutoResetEvent #2.", name)

        Console.WriteLine("{0} ends.", name)
    End Sub
End Class

' This example produces output similar to the following:
'
'Press Enter to create three threads and start them.
'The threads wait on AutoResetEvent #1, which was created
'in the signaled state, so the first thread is released.
'This puts AutoResetEvent #1 into the unsignaled state.
'
'Thread_1 waits on AutoResetEvent #1.
'Thread_1 is released from AutoResetEvent #1.
'Thread_1 waits on AutoResetEvent #2.
'Thread_3 waits on AutoResetEvent #1.
'Thread_2 waits on AutoResetEvent #1.
'Press Enter to release another thread.
'
'Thread_3 is released from AutoResetEvent #1.
'Thread_3 waits on AutoResetEvent #2.
'Press Enter to release another thread.
'
'Thread_2 is released from AutoResetEvent #1.
'Thread_2 waits on AutoResetEvent #2.
'
'All threads are now waiting on AutoResetEvent #2.
'Press Enter to release a thread.
'
'Thread_2 is released from AutoResetEvent #2.
'Thread_2 ends.
'Press Enter to release a thread.
'
'Thread_1 is released from AutoResetEvent #2.
'Thread_1 ends.
'Press Enter to release a thread.
'
'Thread_3 is released from AutoResetEvent #2.
'Thread_3 ends.

Observações

Usas AutoResetEvent, ManualResetEvent, e EventWaitHandle para interação de threads (ou sinalização de thread). Para mais informações, veja Interação com fios.

Uma thread espera por um sinal chamando AutoResetEvent.WaitOne. Se o AutoResetEvent estiver no estado não sinalizado, a thread bloqueia até ser chamado AutoResetEvent.Set . A chamar Set sinais AutoResetEvent para libertar um fio em espera. AutoResetEvent permanece sinalizada até Reset ser chamada ou até que um único thread em espera seja libertado, momento em que regressa automaticamente ao estado não sinalizado.

Se não houver threads à espera quando entra AutoResetEvent num estado sinalizado, o estado permanece sinalizado até que um thread observe o sinal (chamando WaitOne). Esse thread não bloqueia: liberta AutoResetEvent o thread imediatamente e volta ao estado não sinalizado.

Importante

Não há garantia de que cada chamada ao Set método liberte um tópico. Se duas chamadas estiverem demasiado próximas, de modo a que a segunda chamada ocorra antes de um thread ter sido libertado, apenas um thread é libertado. É como se a segunda chamada não tivesse acontecido. Além disso, se Set for chamada quando não há threads à espera e o AutoResetEvent já está sinalizado, a chamada não tem efeito.

Pode controlar o estado inicial de um AutoResetEvent passando um valor booleano ao construtor: true se o estado inicial for sinalizado e false caso contrário.

AutoResetEventpode também ser usado com os staticWaitAll métodos e.WaitAny

AutoResetEvent deriva da EventWaitHandle classe. Um AutoResetEvent é funcionalmente equivalente a um EventWaitHandle criado com EventResetMode.AutoReset.

Note

Ao contrário da AutoResetEvent classe, a EventWaitHandle classe fornece acesso a eventos de sincronização do sistema nomeados.

Importante

Este tipo implementa a interface IDisposable. Quando terminar de usar o tipo, você deve eliminá-lo direta ou indiretamente. Para descartar o tipo diretamente, chame seu método Dispose em um bloco try/catch. Para descartá-lo indiretamente, use uma construção de linguagem como using (em C#) ou Using (em Visual Basic). Para mais informações, consulte a secção "Usar um Objeto que Implementa IDisposável" na IDisposable página da interface.

Construtores

Name Description
AutoResetEvent(Boolean)

Inicializa uma nova instância da AutoResetEvent classe com um valor booleano que indica se deve definir o estado inicial para sinalizado.

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 .

(Herdado de 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)
Reset()

Define o estado do evento para não sinalizado, o que faz com que as threads bloqueem.

Reset()

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

(Herdado de EventWaitHandle)
Set()

Define o estado do evento para sinalizado, o que permite que no máximo uma thread em espera prossiga.

Set()

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

(Herdado de EventWaitHandle)
SetAccessControl(EventWaitHandleSecurity)

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

(Herdado de EventWaitHandle)
ToString()

Devolve uma cadeia que representa o objeto atual.

(Herdado de Object)
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

Esta aula é segura para fios.

Ver também