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");
            //}
        }
Esempio n. 2
0
        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}");
        }