Partilhar via


EventWaitHandle

O EventWaitHandle classe permite que segmentos para se comunicar entre si por sinalização e aguardando sinais. Identificadores de espera do evento (também conhecidas simplesmente como eventos) são identificadores de espera que podem ser sinalizados para liberar um ou mais segmentos de espera. Depois é sinalizada, um identificador de espera do evento é redefinido manualmente ou automaticamente. O EventWaitHandle classe pode representar tanto um evento local identificador de espera (evento local) ou a alça (chamado de evento ou sistema, visível para todos os processos) de espera de um evento do sistema nomeado.

Observação

Os identificadores de espera de eventos não são eventos no sentido de geralmente significa que o word na.NET Framework.Não existem manipuladores de eventos ou representantes envolvidos.A palavra "evento" é usado para descrevê-los, porque eles têm tradicionalmente foi chamados de eventos do sistema operacional e o ato de sinalização do identificador de espera indica para segmentos de espera que um evento ocorreu.

As duas alças de espera do evento local e nomeado usam objetos de sincronização do sistema, que são protegidos por SafeWaitHandle wrappers para garantir que os recursos são liberados. Você pode usar o IDisposable.Dispose método para liberar os recursos imediatamente quando terminar de usar o objeto

Identificadores de espera do evento redefinir automaticamente

Você criar um evento de redefinição automática, especificando EventResetMode.AutoReset Quando você cria o EventWaitHandle objeto. Como o nome sugere, o evento de sincronização redefine automaticamente quando sinalizados, após o lançamento de um único segmento em espera. O evento de sinal chamando seu Set método.

Reinicialização automática de eventos são geralmente usados para fornecer acesso exclusivo a um recurso para um único thread por vez. Um thread solicita o recurso chamando o WaitOne método. Se nenhum outro segmento está mantendo o identificador de espera, o método retorna true e o segmento de chamada tem o controle do recurso.

Observação importanteImportante

Como ocorre com todos os mecanismos de sincronização, você deve garantir que todos os caminhos de código aguardar o identificador de espera adequada antes de acessar um recurso protegido.A sincronização de thread é cooperativa.

Se um evento de redefinição automática é sinalizado quando não há segmentos estão aguardando, permanece sinalizado até que um segmento tenta aguardar nele. O evento libera o segmento e redefine imediatamente, bloqueando os threads subseqüentes.

Identificadores de espera do evento redefinir manualmente

Você cria um evento de redefinição manual especificando EventResetMode.ManualReset Quando você cria o EventWaitHandle objeto. Como o nome sugere, o evento de sincronização deve redefinir manualmente depois que tiver sido assinalada. Até ser redefinida, chamando seu Reset método, segmentos que o identificador de evento de espera continuar imediatamente sem bloqueio.

Um manual redefine atos de evento como a porta de um corral. Quando o evento não está sinalizado, bloqueiam de segmentos que esperar, como cavalos de um corral. Quando o evento é sinalizado, chamando seu Set método, todos os segmentos de espera são livres para prosseguir. O evento permanece signaled até sua Reset método é chamado. Isso torna o evento de redefinição manual de maneira ideal para manter segmentos precisa esperar até que um segmento conclui uma tarefa.

Como os cavalos de deixar um corral leva tempo os threads liberados para ser agendado pelo sistema operacional e continuar a execução. Se o Reset método é chamado antes de todos os threads têm voltou a operar, os demais threads novamente o bloco. Resume qual segmentos e o bloco de threads depende aleatórios fatores como a carga no sistema, o número de threads aguardando para o Agendador e assim por diante. Isso não é um problema se o thread que sinaliza o evento terminar depois de sinalização, que é o padrão de uso mais comum. Se desejar que o thread que sinalizado o evento para iniciar uma nova tarefa depois que todos os threads recomeçaram de espera, você deve bloqueá-lo até que todos os segmentos de espera tem retomado. Caso contrário, você tem uma condição de corrida e o comportamento do seu código é imprevisível.

Eventos de recursos comuns a automática e Manual

Normalmente, um ou mais threads bloqueiam em um EventWaitHandle até que um thread desbloqueado chama o Set método, que libera um dos threads aguardando (no caso de eventos de redefinição automática) ou todos eles (no caso do manual de eventos de redefinição). Um segmento pode sinalizar um EventWaitHandle e, em seguida, bloquear nele, como uma operação atômica, chamando o estático WaitHandle.SignalAndWait método.

EventWaitHandleobjetos podem ser usados com estática WaitHandle.WaitAll e WaitHandle.WaitAny métodos. Porque o EventWaitHandle e Mutex ambos derivam de WaitHandle, você pode usar ambas as classes com esses métodos.

Eventos nomeados

O sistema operacional Windows permite que os identificadores de espera do evento ter nomes. Um evento nomeado é todo o sistema. Ou seja, uma vez criado, o evento nomeado é visível para todos os threads em todos os processos. Assim, os eventos nomeados podem ser usados para sincronizar as atividades de processos, bem como os threads.

Você pode criar um EventWaitHandle objeto que representa um evento do sistema nomeado usando um dos construtores que especifica um nome de evento.

Observação

Como os eventos nomeados são todo o sistema, é possível ter vários EventWaitHandle objetos que representam o mesmo evento nomeado.Cada vez que você chamar um construtor, ou o OpenExisting método, uma nova EventWaitHandle objeto é criado.Especificar o mesmo nome repetidamente cria vários objetos que representam o mesmo evento nomeado.

Cuidado usando eventos nomeados. Porque eles estão em todo o sistema, outro processo que usa o mesmo nome pode bloquear os threads inesperadamente. O código malicioso executado no mesmo computador poderia usar isso como base de um ataque de negação de serviço.

Usar a segurança de controle de acesso para proteger um EventWaitHandle o objeto que representa um evento nomeado, preferencialmente, usando um construtor que especifica um EventWaitHandleSecurity objeto. Você também pode aplicar a segurança de controle de acesso usando o SetAccessControl método, mas isso deixa uma janela de vulnerabilidade entre o momento em que o identificador de espera do evento é criado e a hora em que ele está protegido. Protegendo os eventos com o controle de acesso de segurança ajuda a impedir ataques maliciosos, mas ele não resolve o problema de conflitos de nome não intencionais.

Observação

Ao contrário do EventWaitHandle classe, as classes derivadas AutoResetEvent e ManualResetEvent pode representar apenas local espera alças.Eles não podem representar eventos do sistema nomeado.

Consulte também

Referência

EventWaitHandle

WaitHandle

AutoResetEvent

ManualResetEvent

Outros recursos

EventWaitHandle, AutoResetEvent, CountdownEvent e ManualResetEvent