ManualResetEvent Classe

Definição

Representa um evento de sincronização de threads que, quando sinalizado, deve ser reiniciado manualmente. Esta classe não pode ser herdada.

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

Exemplos

O exemplo seguinte demonstra como ManualResetEvent funciona. O exemplo começa com a ManualResetEvent no estado não sinalizado (isto é, false é passado ao construtor). O exemplo cria três threads, cada um dos quais bloqueia no ManualResetEvent ao chamar o seu WaitOne método. Quando o utilizador pressiona a tecla Enter , o exemplo chama o Set método, que liberta as três threads. Contraste isto com o comportamento da AutoResetEvent classe, que liberta os threads um de cada vez, reiniciando-se automaticamente após cada lançamento.

Pressionar novamente a tecla Enter demonstra que o ManualResetEvent Up permanece no estado sinalizado até que o seu Reset método seja chamado: O exemplo inicia mais dois threads. Estas threads não bloqueiam quando chamam o WaitOne método, mas executam até à conclusão.

Ao pressionar novamente a tecla Enter , o exemplo chama o Reset método e inicia mais uma thread, que bloqueia quando chama WaitOne. Pressionar a tecla Enter uma última vez chama Set a libertação do último fio, e o programa termina.

using System;
using System.Threading;

public class Example
{
    // mre is used to block and release threads manually. It is
    // created in the unsignaled state.
    private static ManualResetEvent mre = new ManualResetEvent(false);

    static void Main()
    {
        Console.WriteLine("\nStart 3 named threads that block on a ManualResetEvent:\n");

        for(int i = 0; i <= 2; i++)
        {
            Thread t = new Thread(ThreadProc);
            t.Name = "Thread_" + i;
            t.Start();
        }

        Thread.Sleep(500);
        Console.WriteLine("\nWhen all three threads have started, press Enter to call Set()" +
                          "\nto release all the threads.\n");
        Console.ReadLine();

        mre.Set();

        Thread.Sleep(500);
        Console.WriteLine("\nWhen a ManualResetEvent is signaled, threads that call WaitOne()" +
                          "\ndo not block. Press Enter to show this.\n");
        Console.ReadLine();

        for(int i = 3; i <= 4; i++)
        {
            Thread t = new Thread(ThreadProc);
            t.Name = "Thread_" + i;
            t.Start();
        }

        Thread.Sleep(500);
        Console.WriteLine("\nPress Enter to call Reset(), so that threads once again block" +
                          "\nwhen they call WaitOne().\n");
        Console.ReadLine();

        mre.Reset();

        // Start a thread that waits on the ManualResetEvent.
        Thread t5 = new Thread(ThreadProc);
        t5.Name = "Thread_5";
        t5.Start();

        Thread.Sleep(500);
        Console.WriteLine("\nPress Enter to call Set() and conclude the demo.");
        Console.ReadLine();

        mre.Set();

        // If you run this example in Visual Studio, uncomment the following line:
        //Console.ReadLine();
    }

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

        Console.WriteLine(name + " starts and calls mre.WaitOne()");

        mre.WaitOne();

        Console.WriteLine(name + " ends.");
    }
}

/* This example produces output similar to the following:

Start 3 named threads that block on a ManualResetEvent:

Thread_0 starts and calls mre.WaitOne()
Thread_1 starts and calls mre.WaitOne()
Thread_2 starts and calls mre.WaitOne()

When all three threads have started, press Enter to call Set()
to release all the threads.


Thread_2 ends.
Thread_0 ends.
Thread_1 ends.

When a ManualResetEvent is signaled, threads that call WaitOne()
do not block. Press Enter to show this.


Thread_3 starts and calls mre.WaitOne()
Thread_3 ends.
Thread_4 starts and calls mre.WaitOne()
Thread_4 ends.

Press Enter to call Reset(), so that threads once again block
when they call WaitOne().


Thread_5 starts and calls mre.WaitOne()

Press Enter to call Set() and conclude the demo.

Thread_5 ends.
 */
Imports System.Threading

Public Class Example

    ' mre is used to block and release threads manually. It is
    ' created in the unsignaled state.
    Private Shared mre As New ManualResetEvent(False)

    <MTAThreadAttribute> _
    Shared Sub Main()

        Console.WriteLine(vbLf & _
            "Start 3 named threads that block on a ManualResetEvent:" & vbLf)

        For i As Integer = 0 To 2
            Dim t As New Thread(AddressOf ThreadProc)
            t.Name = "Thread_" & i
            t.Start()
        Next i

        Thread.Sleep(500)
        Console.WriteLine(vbLf & _
            "When all three threads have started, press Enter to call Set()" & vbLf & _
            "to release all the threads." & vbLf)
        Console.ReadLine()

        mre.Set()

        Thread.Sleep(500)
        Console.WriteLine(vbLf & _
            "When a ManualResetEvent is signaled, threads that call WaitOne()" & vbLf & _
            "do not block. Press Enter to show this." & vbLf)
        Console.ReadLine()

        For i As Integer = 3 To 4
            Dim t As New Thread(AddressOf ThreadProc)
            t.Name = "Thread_" & i
            t.Start()
        Next i

        Thread.Sleep(500)
        Console.WriteLine(vbLf & _
            "Press Enter to call Reset(), so that threads once again block" & vbLf & _
            "when they call WaitOne()." & vbLf)
        Console.ReadLine()

        mre.Reset()

        ' Start a thread that waits on the ManualResetEvent.
        Dim t5 As New Thread(AddressOf ThreadProc)
        t5.Name = "Thread_5"
        t5.Start()

        Thread.Sleep(500)
        Console.WriteLine(vbLf & "Press Enter to call Set() and conclude the demo.")
        Console.ReadLine()

        mre.Set()

        ' If you run this example in Visual Studio, uncomment the following line:
        'Console.ReadLine()

    End Sub


    Private Shared Sub ThreadProc()

        Dim name As String = Thread.CurrentThread.Name

        Console.WriteLine(name & " starts and calls mre.WaitOne()")

        mre.WaitOne()

        Console.WriteLine(name & " ends.")

    End Sub

End Class

' This example produces output similar to the following:
'
'Start 3 named threads that block on a ManualResetEvent:
'
'Thread_0 starts and calls mre.WaitOne()
'Thread_1 starts and calls mre.WaitOne()
'Thread_2 starts and calls mre.WaitOne()
'
'When all three threads have started, press Enter to call Set()
'to release all the threads.
'
'
'Thread_2 ends.
'Thread_0 ends.
'Thread_1 ends.
'
'When a ManualResetEvent is signaled, threads that call WaitOne()
'do not block. Press Enter to show this.
'
'
'Thread_3 starts and calls mre.WaitOne()
'Thread_3 ends.
'Thread_4 starts and calls mre.WaitOne()
'Thread_4 ends.
'
'Press Enter to call Reset(), so that threads once again block
'when they call WaitOne().
'
'
'Thread_5 starts and calls mre.WaitOne()
'
'Press Enter to call Set() and conclude the demo.
'
'Thread_5 ends.

Observações

Usas ManualResetEvent, AutoResetEvent, e EventWaitHandle para interação de threads (ou sinalização de thread). 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 .

Quando uma thread inicia uma atividade que deve ser concluída antes que outras threads prossigam, chama ManualResetEvent.Reset para colocar ManualResetEvent no estado não sinalizado. Este fio pode ser visto como controlando o ManualResetEvent. Threads que chamam o bloco ManualResetEvent.WaitOne , à espera do sinal. Quando o thread controlador conclui a atividade, chama o ManualResetEvent.Set para sinalizar que os threads em espera podem avançar. Todos os tópicos em espera são divulgados.

Uma vez sinalizado, ManualResetEvent permanece sinalizado até ser reiniciado manualmente ao chamar o Reset() método. Ou seja, chamadas para WaitOne regressar imediatamente.

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

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

A partir da versão 2.0 do .NET Framework, ManualResetEvent deriva da classe EventWaitHandle. A ManualResetEvent é funcionalmente equivalente a um EventWaitHandle criado com EventResetMode.ManualReset.

Note

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

A partir da versão 4.0 do .NET Framework, a classe System.Threading.ManualResetEventSlim é uma alternativa leve ao ManualResetEvent.

Construtores

Name Description
ManualResetEvent(Boolean)

Inicializa uma nova instância da ManualResetEvent 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, permitindo que um ou mais threads em espera prossigam.

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