Inquiridor
TRABALHAR COM METODO ASSINCRONO

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(); }
Todas as Respostas
-
-
-
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.
-
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.
-
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.