public void StartProcess()
        {
            var listRegraSADT       = new List <Regra>();
            var listRegraInternacao = new List <Regra>();

            try
            {
                {   // Iniciar LightInjection Scope
                    // ServiceLocator de Repositorios
                    // Objeto de configuração de e-mail

                    var iteration = 0;

                    while (!_cancellationToken.IsCancellationRequested)
                    {
                        var faturas = Mocks.FaturaEmpty;

                        // Numero maximo de iterações na PoC
                        if (iteration < Config.MAX_WHILE_ITERATION)
                        {
                            faturas = Mocks.Faturas(qtdFaturas: Config.NUMBER_OF_INVOICE);

                            iteration++;
                        }
                        else
                        {
                            Program.OnStop();
                        }

                        VerificarAtualizacaoDeRegras(
                            listRegraSADT: listRegraSADT,
                            listRegraInternacao: listRegraInternacao);

                        if (faturas.Any())
                        {
                            var dadosParaValidacao = new DadosParaValidacao(
                                listRegraSADT: listRegraSADT,
                                listRegraInternacao: listRegraInternacao);

                            ProcessarFaturas(faturas, dadosParaValidacao);
                        }

                        if (tasks.Count > 0)
                        {
                            WaitTasks(tasks: tasks);
                        }
                        else
                        {
                            Thread.Sleep(millisecondsTimeout: Config.POOLING_INTERVAL);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Mocks.ServiceRepository.Update("Erro - " + ex.Message);
            }
        }
        public void StartProcess()
        {
            var ListRegraSADT       = new List <Regra>();
            var ListRegraInternacao = new List <Regra>();

            try
            {
                {   // Iniciar LightInjection Scope
                    // ServiceLocator de Repositorios
                    // Objeto de configuração de e-mail

                    var iteration = 0;

                    while (true)
                    {
                        var faturas = Mocks.FaturaEmpty;

                        // Numero maximo de iterações na PoC
                        if (iteration < Config.MAX_WHILE_ITERATION)
                        {
                            faturas = Mocks.Faturas(qtdFaturas: Config.NUMBER_OF_INVOICE);

                            iteration++;
                        }
                        else
                        {
                            // Cannot break :(
                            // break;
                        }

                        if (faturas.Any())
                        {
                            var lastUpdate      = DateTime.MinValue;
                            var ListTodasRegras = new List <Regra>();
                            ListTodasRegras.AddRange(ListRegraSADT);
                            ListTodasRegras.AddRange(ListRegraInternacao);
                            var dataInsercao  = ListTodasRegras.Count > 0 ? ListTodasRegras.Max(o => o.DataInsercao) : DateTime.MinValue;
                            var dataAlteracao = ListTodasRegras.Count > 0 ? ListTodasRegras.Max(o => o.DataAlteracao) : DateTime.MinValue;

                            lastUpdate = dataInsercao;
                            if (dataAlteracao > dataInsercao)
                            {
                                lastUpdate = dataAlteracao;
                            }

                            // Utiliza lastUpdate para verificar se ocorreu atualização das listas
                            if (ListTodasRegras.Count <= 0)
                            {
                                Mocks.Regras.CarregarListaDeRegras(
                                    listRegraSADT: ListRegraSADT,
                                    listRegraInternacao: ListRegraInternacao);
                            }

                            SemaphoreSlim semaphore = new SemaphoreSlim(1);

                            var dadosParaValidacao = new DadosParaValidacao(
                                listRegraSADT: ListRegraSADT,
                                listRegraInternacao: ListRegraInternacao);

                            Task task = new Task(delegate
                            {
                                EfetuarValidacao(faturas, dadosParaValidacao, semaphore);
                            });
                            task.Start();
                        }

                        Thread.Sleep(Config.POOLING_INTERVAL);
                    }
                }
            }
            catch (Exception ex)
            {
                Mocks.ServiceRepository.Update("Erro - " + ex.Message);
            }
        }