Compartilhar via


EventWaitHandle

The EventWaitHandle classe permite que os threads para se comunicar entre si por sinalização e aguardando sinais. Evento aguardar alças (também conhecida simplesmente sistema autônomo eventos) identificadores de espera podem ser avisados para fazer relesistema autônomoe um ou mais threads aguardando.Após está sinalizado, um identificador de espera do evento é redefinido manual ou automaticamente.The EventWaitHandle classe pode representar um identificador de espera do evento local (evento local) ou um identificador de espera de evento do sistema nomeado (evento nomeado ou evento do sistema, visível para todos os processos).

Observação:

Identificadores de espera do evento não são eventos no sentido de geralmente significa palavra no .NET estrutura.Não há nenhum delegados ou evento manipuladores envolvidos.O palavra "evento" é usado para descrevê-los porque eles têm tradicionalmente foi chamados de eventos do sistema operacional e porque o ato de sinalização do identificador de espera indica para segmentos em espera que um evento ocorreu.

Ambos os identificadores de espera de eventos local e nomeado usam objetos de sincronização do sistema, que são protegidos por SafeWaitHandle invólucros para garantir que os recursos são liberados. Você pode usar o IDisposable.Dispose método para liberar os recursos imediatamente quando terminar de utilizar o objeto

Identificadores de espera de evento que reiniciar automaticamente

Você criar automático Redefinir evento especificando EventResetMode.AutoReset Quando você criar o EventWaitHandle objeto. sistema autônomo o nome indica, esse evento de sincronização redefine automaticamente quando sinalizados, após a liberação de uma única em espera thread.Sinalizar o evento, chamando seu Set método.

Automático reiniciar eventos geralmente são 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 Outros segmento está mantendo o identificador de espera, o método retornará true e o thread de chamada tem controle do recurso.

Observação importante:

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

Se um evento de reiniciar automático é sinalizado quando não há segmentos estão aguardando, ela permanecerá sinalizada até que um thread tente aguardar a ele.O evento libera o thread e redefine imediatamente, bloqueando os threads subseqüentes.

Identificadores de espera de evento que reiniciar manualmente

Você cria um evento de reiniciar manual especificando EventResetMode.ManualReset Quando você cria o EventWaitHandle objeto. sistema autônomo o nome indica, esse evento de sincronização deve ser reiniciar manualmente depois que tiver sido sinalizado.Até que ela seja reiniciar, chamando seu Reset método, segmentos aguardar o identificador de eventos imediatamente prosseguir sem bloqueio.

Um manual redefine evento age como a porta de um corral.Quando o evento não está sinalizado, threads que espera nele bloco, como cavalos de um corral.Quando o evento é sinalizado chamando seus Set método, todos os threads em espera estão disponível para continuar. O evento permanece signaled até sua Reset método é chamado. Isso torna o evento de reiniciar manual, Isenção a s thread precisa esperar até que uma maneira ideal thread conclui uma tarefa.

Como cavalos de deixar um corral leva time os threads liberados para ser agendado pelo sistema operacional e continuar a execução.Se o Reset método é chamado antes que todos os threads têm voltou a operar, os demais threads novamente bloco. Resume qual segmentos e qual bloco de threads depende aleatórios fatores como 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 termina após sinalização, que é o padrão de uso mais comum.Se você desejar que o segmento sinalizar o evento para iniciar uma nova tarefa depois que todos os recomeçaram threads em espera, você deve bloco-lo até que todos os threads em espera recomeçaram.Caso contrário, você tem uma condição de corrida e o comportamento do seu código é imprevisível.

Recursos de eventos comuns para automático e manual

Normalmente, um ou mais threads bloco em um EventWaitHandle até que um thread desbloqueado chama o Set método que lança um dos threads em espera (no caso de eventos de reiniciar automático) ou todos eles (no caso do manual reiniciar eventos). Um segmento pode sinalizar um EventWaitHandle e, em seguida, bloco nele, sistema autônomo uma operação atômica, chamando o estático WaitHandle.SignalAndWait método.

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

Eventos nomeados

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

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 sistema largo, é possível ter vários EventWaitHandle objetos que representam o mesmo evento nomeado. Sempre que você chamar um construtor ou o OpenExisting método, um novo EventWaitHandle objeto é criado. Especificando o mesmo nome repetidamente cria vários objetos que representam o mesmo evento nomeado.

Cuidado é aconselhável usando eventos nomeados.Porque eles são todo o sistema, outro processo que usa o mesmo nome pode bloquear os threads inesperadamente.O código mal-intencionado executado no mesmo computador pode usar isso sistema autônomo a base de um ataque de negação de serviço.

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

Observação:

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

Consulte também

Referência

EventWaitHandle

WaitHandle

AutoResetEvent

ManualResetEvent

Outros recursos

EventWaitHandle AutoResetEvent e ManualResetEvent