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.