Problem with Return from Parallel.ForEach

0

Good evening everyone!

I am making a system in C # WindowsForms for validation of FEBRABAN V2 model phone bills.

The files usually have between 600Mb to 15Gb, so I opted for the use of Parallel.ForEach, and really turned the performance into a gigantic gain, 2h validation things dropped to mere 40s on reading almost 5 million lines .

Going to the system.

// PRINTER SYSTEM CLASS

try
                    {
                        int? linhaTotal = File.ReadAllLines(catalogPath).Count();
                        Parallel.ForEach(File.ReadLines(catalogPath), (linha, pls, rownumber) =>
                        {
                            if (linha.Length == 350)
                            {
                                String line = linha.Substring(0, 1);
                                switch (line)
                                {
                                    case "0": logicaV2.ValidaHeader(Convert.ToInt32(rownumber + 1), linha, header); break;
                                    case "1": logicaV2.ValidaContaResumo(Convert.ToInt32(rownumber + 1), linha, contaResumo); break;
                                    case "2": logicaV2.ValidaEndereco(Convert.ToInt32(rownumber + 1), linha, enderecoPonta); break;
                                    case "3": retornoGeral = logicaV2.ValidaBilhetacao(Convert.ToInt32(rownumber + 1), linha, bilhetacao, listaErro, pkArquivo); break;
                                    //case "4": logicaV2.ValidaServico(sequencial, linha); break;
                                    //case "5": logicaV2.ValidaDescontos(sequencial, linha); break;
                                    //case "9": logicaV2.ValidaTrailler(sequencial, linha); break;
                                }
                            }
                            else
                            {
                                Console.WriteLine("Linha: {0}", rownumber);
                            }

                            //valorTotalFatura = retornoGeral.listaValor.Sum();
                        });
                    }
                    catch (AggregateException e)
                    {
                        Console.WriteLine("Erro Geral: {0} ", e);
                    }

// CLASS NEValidatorV2 (where the validations of each type are made, I only posted one of 9 as an example)

V2DB001DataContext context = new V2DB001DataContext();
        Boolean isValid = true;
        Form1.objErros objErros = new Form1.objErros();

        Form1.objRetorno retornoGeral = new Form1.objRetorno();

        public decimal? valorLigacao = 0,
            valorTotal = 0;

#region VALIDA BILHETAÇÃO

        public Form1.objRetorno ValidaBilhetacao(int sequencial, String linha, List<T004_BILHETACAO> bilhetacao, List<T009_ERRO> listaErro, int? pkArquivo)
        {
            foreach (var item in bilhetacao)
            {
                String campo = linha.Substring((int)item.T004_POSICAO_INICIO, (int)item.T004_POSICAO_FIM);
                if (item.T004_DE_REGISTRO.Equals("TIPO_REGISTRO"))
                {
                    isValid = (campo.Length == item.T004_POSICAO_FIM ? (campo.Equals("3") ? true : false) : false);
                }
                else if (item.T004_DE_REGISTRO.Equals("SEQUENCIAL_GRAVACAO"))
                {
                    isValid = (campo.Length == item.T004_POSICAO_FIM ? (int.Parse(campo).Equals(sequencial) ? true : false) : false);
                }
                else if (item.T004_DE_REGISTRO.Equals("DT_VENCIMENTO"))
                {
                    if (campo.Length == item.T004_POSICAO_FIM)
                    {
                        try
                        {
                            campo = campo.Substring(0, 4) + "-" + campo.Substring(4, 2) + "-" + campo.Substring(6, 2);
                            Convert.ToDateTime(campo);
                            isValid = true;
                        }
                        catch
                        {
                            isValid = false;
                        }
                    }
                }
                else if (item.T004_DE_REGISTRO.Equals("DT_EMISSAO"))
                {
                    if (campo.Length == item.T004_POSICAO_FIM)
                    {
                        try
                        {
                            campo = campo.Substring(0, 4) + "-" + campo.Substring(4, 2) + "-" + campo.Substring(6, 2);
                            Convert.ToDateTime(campo);
                            isValid = true;
                        }
                        catch
                        {
                            isValid = false;
                        }
                    }
                }
                else if (item.T004_DE_REGISTRO.Equals("ID_UNICO_RECURSO"))
                {
                    if (campo.Length == item.T004_POSICAO_FIM)
                    {
                        if (campo.Trim().Length <= item.T004_POSICAO_FIM)
                        {
                            isValid = true;
                        }
                        else
                        {
                            isValid = false;
                        }
                    }
                    else
                    {
                        isValid = false;
                    }
                }
                else if (item.T004_DE_REGISTRO.Equals("CNL_RECURSO_REFERENCIA"))
                {
                    isValid = (campo.Length == item.T004_POSICAO_FIM ? true : false);
                }
                else if (item.T004_DE_REGISTRO.Equals("DDD"))
                {
                    isValid = (campo.Length == item.T004_POSICAO_FIM ? validaDDD(campo) : false);
                }
                else if (item.T004_DE_REGISTRO.Equals("NU_TELEFONE"))
                {
                    isValid = (campo.Length == item.T004_POSICAO_FIM ? true : false);
                }
                else if (item.T004_DE_REGISTRO.Equals("CARACTERISTICA_RECURSO"))
                {
                    isValid = (campo.Length == item.T004_POSICAO_FIM ? true : false);
                }
                else if (item.T004_DE_REGISTRO.Equals("DEGRAU_RECURSO"))
                {
                    isValid = (campo.Length == item.T004_POSICAO_FIM ? true : false);
                }
                else if (item.T004_DE_REGISTRO.Equals("DT_LIGACAO"))
                {
                    if (campo.Length == item.T004_POSICAO_FIM)
                    {
                        try
                        {
                            campo = campo.Substring(0, 4) + "-" + campo.Substring(4, 2) + "-" + campo.Substring(6, 2);
                            Convert.ToDateTime(campo);
                            isValid = true;
                        }
                        catch
                        {
                            isValid = false;
                        }
                    }
                }
                else if (item.T004_DE_REGISTRO.Equals("CNL_LOCALIDADE_CHAMADA"))
                {
                    isValid = (campo.Length == item.T004_POSICAO_FIM ? true : false);
                }
                else if (item.T004_DE_REGISTRO.Equals("NO_LOCALIDADE_CHAMADA"))
                {
                    if (campo.Length == item.T004_POSICAO_FIM)
                    {
                        if (campo.Trim().Length <= item.T004_POSICAO_FIM)
                        {
                            isValid = true;
                        }
                        else
                        {
                            isValid = false;
                        }
                    }
                    else
                    {
                        isValid = false;
                    }
                }
                else if (item.T004_DE_REGISTRO.Equals("UF_FONE_CHAMADO"))
                {
                    isValid = (campo.Length == item.T004_POSICAO_FIM ? validaUf(campo) : false);
                }
                else if (item.T004_DE_REGISTRO.Equals("CO_NACIONAL_INTERNACIONAL"))
                {
                    isValid = (campo.Length == item.T004_POSICAO_FIM ? (campo.Trim().Equals("0") || campo.Trim().Equals("00") ? true : false) : false);
                }
                else if (item.T004_DE_REGISTRO.Equals("CO_OPERADORA"))
                {
                    isValid = (campo.Length == item.T004_POSICAO_FIM ? validaCodOperadora(campo) : false);
                }
                else if (item.T004_DE_REGISTRO.Equals("DE_OPERADORA"))
                {
                    if (campo.Length == item.T004_POSICAO_FIM)
                    {
                        if (campo.Trim().Length <= item.T004_POSICAO_FIM)
                        {
                            isValid = true;
                        }
                        else
                        {
                            isValid = false;
                        }
                    }
                    else
                    {
                        isValid = false;
                    }
                }
                else if (item.T004_DE_REGISTRO.Equals("CO_PAIS_CHAMADO"))
                {
                    isValid = (campo.Length == item.T004_POSICAO_FIM ? String.IsNullOrEmpty(campo.Trim()) ? true : validaCodInternacional(campo) : false);
                }
                else if (item.T004_DE_REGISTRO.Equals("AREA_DDD"))
                {
                    isValid = (campo.Length == item.T004_POSICAO_FIM ? String.IsNullOrEmpty(campo.Trim()) ? true : validaDDD(campo.Trim()) : false);
                }
                else if (item.T004_DE_REGISTRO.Equals("NU_FONE_CHAMADO"))
                {
                    isValid = (campo.Length == item.T004_POSICAO_FIM ? true : false);
                }
                else if (item.T004_DE_REGISTRO.Equals("CONJUGADO_CHAMADO"))
                {
                    if (campo.Length == item.T004_POSICAO_FIM)
                    {
                        if (campo.Trim().Length <= item.T004_POSICAO_FIM)
                        {
                            isValid = true;
                        }
                        else
                        {
                            isValid = false;
                        }
                    }
                    else
                    {
                        isValid = false;
                    }
                }
                else if (item.T004_DE_REGISTRO.Equals("DURACAO"))
                {
                    isValid = (campo.Length == item.T004_POSICAO_FIM ? true : false);
                }
                else if (item.T004_DE_REGISTRO.Equals("CATEGORIA"))
                {
                    isValid = (campo.Length == item.T004_POSICAO_FIM ? true : false);
                }
                else if (item.T004_DE_REGISTRO.Equals("DE_CATEGORIA"))
                {
                    if (campo.Length == item.T004_POSICAO_FIM)
                    {
                        if (campo.Trim().Length <= item.T004_POSICAO_FIM)
                        {
                            isValid = true;
                        }
                        else
                        {
                            isValid = false;
                        }
                    }
                    else
                    {
                        isValid = false;
                    }
                }
                else if (item.T004_DE_REGISTRO.Equals("HORARIO_LIGACAO"))
                {
                    isValid = (campo.Length == item.T004_POSICAO_FIM ? true : false);
                }
                else if (item.T004_DE_REGISTRO.Equals("TIPO_CHAMADA"))
                {
                    isValid = (campo.Length == item.T004_POSICAO_FIM ? true : false);
                }
                else if (item.T004_DE_REGISTRO.Equals("GRUPO_HOR_TARIFARIO"))
                {
                    isValid = (campo.Length == item.T004_POSICAO_FIM ? true : false);
                }
                else if (item.T004_DE_REGISTRO.Equals("DE_HOR_TARIFARIO"))
                {
                    isValid = (campo.Length == item.T004_POSICAO_FIM ? true : false);
                }
                else if (item.T004_DE_REGISTRO.Equals("DEGRAU_LIGACAO"))
                {
                    isValid = (campo.Length == item.T004_POSICAO_FIM ? (!String.IsNullOrEmpty(campo.Trim()) ? true : false) : false);
                }
                else if (item.T004_DE_REGISTRO.Equals("SINAL_VALOR_LIGACAO"))
                {
                    isValid = (campo.Length == item.T004_POSICAO_FIM ? (campo.Equals("+") || campo.Equals("-") ? true : false) : false);

                }
                else if (item.T004_DE_REGISTRO.Equals("ALIQUOTA"))
                {
                    isValid = (campo.Length == item.T004_POSICAO_FIM ? true : false);
                }
                else if (item.T004_DE_REGISTRO.Equals("VALOR_LIGACAO"))
                {
                    if (campo.Length == item.T004_POSICAO_FIM)
                    {
                        if (campo.Trim().Length <= item.T004_POSICAO_FIM)
                        {
                            isValid = true;
                            valorLigacao = (decimal?)Convert.ToInt32(campo) / 100;
                            valorTotal += valorLigacao;
                            //Console.WriteLine("Linha: {0} Valor: {1} Total: {2}", sequencial, valorLigacao, valorTotal);
                            retornoGeral.listaValor.Add(valorLigacao);
                        }
                        else
                        {
                            isValid = false;
                        }
                    }
                    else
                    {
                        isValid = false;
                    }
                }
                else if (item.T004_DE_REGISTRO.Equals("CLASSE_SERVICO"))
                {
                    isValid = (campo.Length == item.T004_POSICAO_FIM ? true : false);
                }
                else if (item.T004_DE_REGISTRO.Equals("FILLER"))
                {
                    isValid = (campo.Length == item.T004_POSICAO_FIM ? ( String.IsNullOrEmpty(campo.Trim()) ? true : false) : false);
                }
                if (!isValid)
                {
                    bool valida = armazenaErro(listaErro, sequencial, pkArquivo, item.T004_OBSERVACAO, (bool)item.T004_FLAG_IMPEDITIVO);

                    isValid = true;
                }

            }

            retornoGeral.objRetornoErros = objErros;
            retornoGeral.valorTotal = valorTotal;

            return retornoGeral;
        }

        #endregion

But briefly, the process is split between my two cores ... The problem is that one core can reach the end of the file while the other is somewhere else in the file, so it can not return the EXACT FINAL VALUE, it always returns me where the last Thread ends.

I would like to know if there is any way to perfectly synchronize Threads by making my return the last one being the last line of my document.

    
asked by anonymous 12.05.2016 / 18:13

0 answers