public void Criar(ConfiguracaoGlobalDto dto) { // tornamos o código de criação concorrente // ATENÇÃO!! REMOVA OS COMENTÁRIOS ABAIXO PARA VER O PROBLEMA SER RESOLVIDO //lock (_bloquearInstancia) //{ Console.WriteLine("Tentando adicionar configuração"); var configuracaoJaExiste = _repositorio.Obter().Any(); if (configuracaoJaExiste) { Console.WriteLine("Não será adicionada a configuração, pois já existe 1 configuração válida"); return; } _repositorio.Adicionar(new ConfiguracaoGlobal(dto.PodeFazerAlgo)); Console.WriteLine("Nova configuração adicionada com sucesso"); //} }
public void Executar() { // Iremos simular 20 threads simultâneas, o equivalente a 20 pessoas diferentes abrirem a tela que cria // a configuração global, e as 20 apertarem no salvar em paralelo var threads = new Thread[20]; var repo = new RepositorioConfiguracaoGlobal(); // Limpamos as configurações existentes, para poder rodar o exemplo várias vezes repo.Deletar(); for (int i = 0; i < threads.Length; i++) { var i1 = i; // Cada thread basicamente irá tentar criar uma nova configuração, o que seria feito clicando no botão salvar da tela threads[i] = new Thread(new ThreadStart(() => new ServicoConfiguracaoGlobal().Criar(new ConfiguracaoGlobalDto() { PodeFazerAlgo = i1 % 2 == 0 }))); } // Iniciar execução das threads em paralelo foreach (var thread in threads) { thread.Start(); } // Pausar thread principal aguardando o processamento das demais foreach (var thread in threads) { thread.Join(); } var qtdConfigsCriadas = repo.Obter().Count; Console.WriteLine($"Total de configurações criadas após o exemplo {qtdConfigsCriadas}"); }