/// <summary> /// Método responsável por executar a contagem dos votos e da impressão parcial. /// </summary> public void Run() { int counter = 0; for (int i = firstPos; i < lastPos; i++) { votesCounted[votes[i]]++; // Adiciona um voto para o canditado votes[i] counter++; if (counter % numberVotesPartial == 0) // Verifica se não contou o número necessários de votos para a impressão parcial { VoteCounter.PrintStatus(this); // Imprime o resultado parcial barrier.SignalAndWait(); // Aguarda o término das outras threads para voltar a contar os votos } } }
/// <summary> /// Método estático para impressão de forma sincronizada dos resultados contabilizados por um VoteCounter /// </summary> /// <param name="vc">objeto na qual se deseja saber o resultado</param> public static void PrintStatus(VoteCounter vc) { Monitor.Enter(Lock); // Thread tenta pegar o lock try { System.Console.WriteLine(vc.Name + ":"); for (int i = 0; i < vc.NumberCandidates; i++) { System.Console.WriteLine(" Candidate " + i + ": " + vc.CandidateVotesCounted(i) + " votes."); } } finally // Bloco finally para garantir a liberação do lock em caso de erro { Monitor.Exit(Lock); // Thread libera o lock } }