Em outras palavras, eu tenho um thread que inicia e chama waitHandle.Set()
várias vezes. Então eu começo vários tópicos e cada um está esperando WaitHandle
. Será que X deles será sinalizado onde X é o número de vezes que o segmento original é chamado waitHandle.Set()
?
Existe uma estrutura que suporta o que eu estou tentando realizar mais de perto?
Respostas:
9 para resposta № 1Talvez, mas provavelmente não.
Um evento só pode ser definido ou cancelado, se houvernada para cancelar o evento, em seguida, as chamadas repetidas para Set não alterarão seu estado, a menos que seja um evento de redefinição automática e haja pelo menos um thread aguardando. Com um evento de redefinição manual, qualquer encadeamento aguardando (ou começando a aguardar) será liberado até que algo seja cancelado.
Eu acho que você vai realmente querer um semáforo, que tem uma contagem e suporta configuração n vezes para liberar n encadeamentos (mesmo se alguns desses encadeamentos só começarem a esperar depois de algumas das chamadas serem configuradas).
3 para resposta № 2
Depende do EventResetMode
. Se estiver configurado para EventResetMode.AutoReset
só liberará um segmento. Se for "EventResetMode.ManualReset", ele irá liberar todos os threads bloqueados no evento.
Semaphore.Release(Int)
Onde Int é a contagem seria 1 maneira de fazer isso.
1 para resposta № 3
Como Richard declarou, EventWaitHandles tem apenas um único sinalizador e não pode contar o número de vezes que Set foi chamado. A solução simplificada de adicionar uma variável count provoca uma condição de corrida.
William Kempf tem um artigo sobre por que as variáveis de contagem não funcionam e uma solução usando a classe .Net Monitor.