Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

webruno

[Resolvido] Processo lento com try catch (C#)

Recommended Posts

Opa, beleza?

 

Preciso de um help no seguinte:

 

estou usando um DataGridViewComboBoxColumn em um DataGrid. Só que, pelo o que eu pude notar, o ComboBox só é realmente criado se você selecionar alguma opção dele. Se nenhuma opção for selecionada é como se ele não tivesse sido instanciado.

 

No meu caso, nem todos os ComboBox são de preenchimento obrigatório. Então na hora de disparar o formulário eu uso o seguinte código:

 

OdbcDataReader dr = cmd.ExecuteReader();

while (dr.Read())
{
   for (int y = 0; y < this.dataGridClientes.Rows.Count; y++)
   {
      try
      {
         if (this.dataGridClientes["cbID_CLIENTE", y].Value.ToString() != "")
         {
            ID_CLIENTE = int.Parse(dr[this.dataGridClientes["cbID_CLIENTE", y].Value.ToString()].ToString());
         }
      }
      catch (Exception e){}
   }
}

Como este código está dentro de um For que se repete umas 4 mil vezes, acaba ficando lento de mais. Sem o try/catch o código é rapidão e não dá estouro de memória.

 

Há outra maneira de testar se o objeto existe sem o try/catch?

 

Obrigado pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, beleza?

 

Preciso de um help no seguinte:

 

estou usando um DataGridViewComboBoxColumn em um DataGrid. Só que, pelo o que eu pude notar, o ComboBox só é realmente criado se você selecionar alguma opção dele. Se nenhuma opção for selecionada é como se ele não tivesse sido instanciado.

 

No meu caso, nem todos os ComboBox são de preenchimento obrigatório. Então na hora de disparar o formulário eu uso o seguinte código:

 

OdbcDataReader dr = cmd.ExecuteReader();

while (dr.Read())
{
   for (int y = 0; y < this.dataGridClientes.Rows.Count; y++)
   {
      try
      {
         if (this.dataGridClientes["cbID_CLIENTE", y].Value.ToString() != "")
         {
            ID_CLIENTE = int.Parse(dr[this.dataGridClientes["cbID_CLIENTE", y].Value.ToString()].ToString());
         }
      }
      catch (Exception e){}
   }
}

Como este código está dentro de um For que se repete umas 4 mil vezes, acaba ficando lento de mais. Sem o try/catch o código é rapidão e não dá estouro de memória.

 

Há outra maneira de testar se o objeto existe sem o try/catch?

 

Obrigado pela atenção.

 

Opa!

 

Realmente, usar try/catch dentro de um for é uma opção lenta porque cada chamada a um tratamento de exceção que você faz é uma thread nova que o .net abre pra que o mecanismo não dispare um erro na tela. Por isso fica lento, o que poderia ser feito numa única thread acaba sendo feito usando zilhões de threads...

 

No caso do seu código, eu resolveria isso testando se o objeto é nulo ou se o vetor possui length > 0.

 

Tente algo parecido com isso:

 

OdbcDataReader dr = cmd.ExecuteReader();

while (dr.Read())
{
   for (int y = 0; y < this.dataGridClientes.Rows.Count; y++)
   {
     if(this.dataGridClientes["cbID_CLIENTE", y] != null)
     {
         if (this.dataGridClientes["cbID_CLIENTE", y].Value.ToString() != "")
         {
            ID_CLIENTE = int.Parse(dr[this.dataGridClientes["cbID_CLIENTE", y].Value.ToString()].ToString());
         }
     }
   }
}

 

Não testei, mas creio que o caminho seja por aí...

 

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela atenção Thompson.

 

Pior que não deu certo cara, olha só o erro:

 

System.NullReferenceException was unhandled

"Referência de objeto não definida para uma instância de um objeto."

 

Isso aparece na linha do "if(this.dataGridClientes["cbID_CLIENTE", y] != null)"

 

Eu já tinha tentado isso antes...

 

É aquela história que falei: o DataGridViewComboBoxColumn só é realmente instanciado quando uma das opções dentro dele é selecionada. Antes disso ele "finge" que está no grid mas não está. Acho que é uma solução do .net para não ficar instanciado objeto dinâmico que talvez nem seja usado.

 

Uma prova disso é que quando o ComboBox é mostrado no DataGrid as opções dentro dele não aparecem até que o usuário clique nele para abrí-lo.

 

Muito obrigado. Se você ou outro usuário souber outra solução agradeço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que retorna o NullReferenceException é o dataGridClientes["cbID_CLIENTE", y]. Porém se eu seleciono uma opção dentro do Combo, não dá o erro.

 

Como falei antes, pelo o que percebi, o ComboBox só é instanciado se uma opção é escolhida. Porém, no meu form, o usuário não é obrigado a selecionar nada. Então quando vou verificar o valor ele dá o erro de que o objeto não existe.

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Problema resolvido.

 

O Thompson tinha dito para colocar: if(this.dataGridClientes["cbID_CLIENTE", y] != null)

 

Mas o correto é: if(this.dataGridClientes["cbID_CLIENTE", y].Value != null)

 

Por um ".Value" não funcionava, hehe.

 

Obrigado a todos.

Compartilhar este post


Link para o post
Compartilhar em outros sites


OdbcDataReader dr = cmd.ExecuteReader();

 

while (dr.Read())

{

try{

for (int y = 0; y < this.dataGridClientes.Rows.Count; y++)

{

if (this.dataGridClientes["cbID_CLIENTE", y].Value.ToString() != "")

{

ID_CLIENTE = int.Parse(dr[this.dataGridClientes["cbID_CLIENTE", y].Value.ToString()].ToString());

}

}

catch (Exception e){}

}

}

Tambem é uma opção

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.