none
TRABALHAR COM METODO ASSINCRONO RRS feed

  • Pergunta

  • Boa tarde.

    Eu tenho em meu projeto alguns métodos para fazer verificação em listas. Estes métodos chegam a travar a interface do usuário. Já tentei entender o processo de como criar métodos assincronos mas não consegui entender.

    Como eu poderia transformar este método em um método assincrono?

    Método:

    private void Analisar()
            {
                bool blnComp;
    
                dataGridViewAnalise.Rows.Clear();
                dataGridViewAnalise.Update();
                dataGridViewAnalise.Refresh();
    
                try
                {
                    btAnalisar.Text = "Analisando...";
                    btAnalisar.Enabled = false;
    
                    //Notas ausentes no relatório da ConsisaNet
                    if (radioButtonNotasAusentesConsisaNet.Checked == true)
                    {
                        blnComp = false;
    
                        for (int i = 0; i < dataGridViewSefaz.Rows.Count; i++)
                        {
                            for (int index = 0; index < dataGridViewConsisaNet.Rows.Count; index++)
                            {
                                if (dataGridViewSefaz.Rows[i].Cells[1].Value.ToString().Equals(dataGridViewConsisaNet.Rows[index].Cells[1].Value.ToString()) &&
                                    dataGridViewSefaz.Rows[i].Cells[2].Value.ToString().Equals(dataGridViewConsisaNet.Rows[index].Cells[2].Value.ToString()))
                                {
                                    blnComp = true;
                                    break;
                                }
                            }
    
                            if (!blnComp)
                            {
                                dataGridViewAnalise.Rows.Add(
                                    dataGridViewSefaz.Rows[i].Cells[2].Value.ToString(),
                                    dataGridViewSefaz.Rows[i].Cells[1].Value.ToString(),
                                    dataGridViewSefaz.Rows[i].Cells[3].Value.ToString(),
                                    dataGridViewSefaz.Rows[i].Cells[8].Value);
                            }
                            else
                            {
                                blnComp = false;
                            }
                        }
                    }
    
                    // Notas ausentes no relatório da Sefaz
                    if (radioButtonNotasAusentesSefaz.Checked == true)
                    {
                        blnComp = false;
    
                        for (int i = 0; i < dataGridViewConsisaNet.Rows.Count; i++)
                        {
                            for (int index = 0; index < dataGridViewSefaz.Rows.Count; index++)
                            {
                                if (dataGridViewConsisaNet.Rows[i].Cells[1].Value.ToString().Equals(dataGridViewSefaz.Rows[index].Cells[1].Value.ToString()) &&
                                    dataGridViewConsisaNet.Rows[i].Cells[2].Value.ToString().Equals(dataGridViewSefaz.Rows[index].Cells[2].Value.ToString()))
                                {
                                    blnComp = true;
                                    break;
                                }
                            }
    
                            if (!blnComp)
                            {
                                dataGridViewAnalise.Rows.Add(
                                    dataGridViewConsisaNet.Rows[i].Cells[2].Value.ToString(),
                                    dataGridViewConsisaNet.Rows[i].Cells[1].Value.ToString(),
                                    null,
                                    dataGridViewConsisaNet.Rows[i].Cells[3].Value);
                            }
                            else
                            {
                                blnComp = false;
                            }
                        }
                    }
    
                    // Notas com valores divergentes
                    if (radioButtonNotasDivergentes.Checked == true)
                    {
                        for (int i = 0; i < listaSefaz.Count; i++)
                        {
                            for (int index = 0; index < listaConsisanet.Count; index++)
                            {
                                if (listaSefaz[i].SITUACAO != "Cancelado" ||
                                    listaSefaz[i].SITUACAO != "Cancelada")
                                {
                                    if (listaSefaz[i].SERIE.Equals(listaConsisanet[index].SERIE) &&
                                    listaSefaz[i].NUM_DOC.Equals(listaConsisanet[index].NUM_DOC))
                                    {
                                        if (listaSefaz[i].VL_DOCUMENTO != listaConsisanet[index].VL_CONTABIL)
                                        {
                                            dataGridViewAnalise.Rows.Add(
                                            listaSefaz[i].NUM_DOC,
                                            listaSefaz[i].SERIE,
                                            listaSefaz[i].CHV_ACESSO,
                                            null,
                                            null,
                                            null,
                                            listaSefaz[i].VL_DOCUMENTO,
                                            listaConsisanet[index].VL_CONTABIL,
                                            Convert.ToDecimal(listaSefaz[i].VL_DOCUMENTO) - Convert.ToDecimal(listaConsisanet[index].VL_CONTABIL)
                                            );
                                        }
                                    }
                                }
                            }
                        }
                    }
    
                    // Diferença entre valores Contábil e Fiscal
                    if (radioButtonDiferentaValorContabilFiscal.Checked == true)
                    {
                        foreach (DataGridViewRow linha in dataGridViewConsisaNet.Rows)
                        {
                            if (Convert.ToDecimal(linha.Cells[3].Value) != Convert.ToDecimal(linha.Cells[5].Value))
                            {
                                dataGridViewAnalise.Rows.Add(
                                    linha.Cells[2].Value,
                                    linha.Cells[1].Value,
                                    null,
                                    null,
                                    linha.Cells[3].Value,
                                    linha.Cells[5].Value,
                                    null,
                                    null,
                                    Convert.ToDecimal(linha.Cells[3].Value.ToString()) - Convert.ToDecimal(linha.Cells[5].Value.ToString()));
                            }
                        }
                    }
    
                    btAnalisar.Text = "Analisar";
                    btAnalisar.Enabled = true;
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Exceção: " + ex.ToString(), "Exceção", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }

    Botão Analisar:

            private void btAnalisar_Click(object sender, EventArgs e)
            {
                Analisar();
            }

    sexta-feira, 8 de fevereiro de 2019 18:45

Todas as Respostas

  • Preciso de ajuda pessoal. Alguém poderia ajudar?
    quarta-feira, 13 de fevereiro de 2019 11:22
  • Boa Noite Jehan,

    Não sei se usar métodos assíncronos resolveria seu problema, eu quebraria seu código em métodos, debugando-os para saber o que causa travamento da interface.


    quinta-feira, 14 de fevereiro de 2019 18:54
  • Boa Noite Jehan,

    Não sei se usar métodos assíncronos resolveria seu problema, eu quebraria seu código em métodos, debugando-os para saber o que causa travamento da interface.


    Bom dia danilodesouzax, não seria o código em si, mas o trabalho que está sendo executado. Para entender melhor o que essa janela da minha aplicação faz, irei te explicar.

    Desenvolvi uma ferramenta em meu trabalho, que consiste em analisar duas planilhas. A primeira é baixada diretamente da Sefaz e ela contêm uma lista de dados referentes a notas fiscais emitidas. A segunda é gerada no sistema contábil logo após eu importar todos os arquivos xml que as empresas nos enviam.

    O que minha aplicação faz é analisar 4 tipos de situações diferentes entre as duas planilhas, claro que, o usuário é obrigado a selecionar apenas uma por controles RadioButton. São elas, Quando falta notas na sefaz, quando falta notas no sistema, quando há valores diferentes entre Sefaz e Sistema e quando a valores diferentes entre contábil e fiscal do sistema.

    Quando a empresa tem pouco movimento, digamos de 100 a 1000 notas, a análise que minha aplicação faz é bem rápida, exigindo poucos segundos e o usuário recebe o resultado em tela e nem percebe o que houve.

    Porém, quando a empresa tem movimentação de 2000 a 5, 6, 7 e ate 12000 arquivos por mês, como é o caso de alguns supermercados ou postos de combustíveis, a situação já muda logo de cara. Demora muito por consequência da quantidade de linhas contidas em cada planilha. Devido a isso, métodos síncronos costumam travar a interface do usuário enquanto está fazendo sua tarefa.

    Espero que tenha compreendido o motivo e a necessidade. Contudo, informo que consegui resolver parcialmente meu problema. O desafio agora é conseguir implementar o cancelamento do método em tempo de execução caso o usuário deseje por qualquer motivo que seja.

    Obrigado pelo comentário e interesse em ajudar. 

    sexta-feira, 29 de março de 2019 12:41
  • Não sei se ajudaria, eu usaria um banco de dados para processar isso, criando duas tabelas com os campos que deseja processar, popule-as utilizando o book insert, depois basta usar Left Join e comandos Sql que suas buscas ficam otimizadas.

    Outra solução seria utilizar Linq.

    sexta-feira, 29 de março de 2019 13:18
  • Boa tarde Valdeir Caires.

    Eu acho que seria mais trabalhoso e desnecessário. Mas eu já consegui resolver a situação. Consegui implementar no método o Async e Wait.

    Está funcionando da forma que eu queria. O problema agora é implementar o botão de "Parar" para que o usuário possa parar o método caso ele deseje.

    Obrigado por sua contribuição.

    terça-feira, 2 de abril de 2019 21:05