Usuário com melhor resposta
Carregar DataGridView com uma thred a cada 5 minutos

Pergunta
-
Boa noite!!
Venho batendo cabeça já alguns dias. Eu tenho um DataGrid e preciso atualizar ele a cada 5 minutos, ja fiz isso com timer mas meu sistema fica travando, dei uma estudada e vi que posso fazer isso atraves de uma thred. Tentei implementar em meu codigo mas quando coloco para rodar me da um erro que e o seguinte:
Additional information: Operação entre threads inválida: controle 'dgvCliente' acessado de um thread que não é aquele no qual foi criado.
Quando o dgvCliente vai ser carregado pela classe de coleção me da este erro.
Sera que alguém pode me ajudar?
Des de ja agradeço
alex alves
Respostas
-
Olá Alex,
isso ocorre devido ao acessar um controle da trhead principal a partir de outra thread, pode utilizar Trhead Safe para isso !
Veja esse Post Thread Safe !
Existem outros alternativas utilizando Tasks também, mas caso não consiga com o exemplo acima, poste seu codigo de como popula seu grid a partir de outra thread.
- Marcado como Resposta Marcos SJ quarta-feira, 9 de setembro de 2015 20:12
Todas as Respostas
-
Olá Alex,
isso ocorre devido ao acessar um controle da trhead principal a partir de outra thread, pode utilizar Trhead Safe para isso !
Veja esse Post Thread Safe !
Existem outros alternativas utilizando Tasks também, mas caso não consiga com o exemplo acima, poste seu codigo de como popula seu grid a partir de outra thread.
- Marcado como Resposta Marcos SJ quarta-feira, 9 de setembro de 2015 20:12
-
Bom dia ,
Cara usa uma Thread para isso. Cria um método que atualiza a sua Grid e chama ele dentro do método que vc vai criar essa thread, assim não vai travar seu sistema nesses 5 minutos e ele vai cair na chamada do método carregar grid só depois desse tempo. Nesse exemplo eu to usando uma Thread pra carregar um progressbar. Acho que vai te ajudar.
No seu caso acho que vc vai ter que passar Thread.Sleep(300000) para ele esperar 5 minutos.
continua = true; Control.CheckForIllegalCrossThreadCalls = false; DateTime horaInicial = Convert.ToDateTime(lblRelogio.Text); DateTime horaFinal = Convert.ToDateTime(txtHora.Text); TimeSpan QtdHoras = horaFinal.Subtract(horaInicial); double QtdSegundos = QtdHoras.TotalSeconds; progressBar1.Maximum = Convert.ToInt32(QtdSegundos); Thread segundos = new Thread(() => Contagem(QtdSegundos, horaFinal)); segundos.Start(); ----------------------------------------------------------- #region Método contador private void Contagem(double Segundos, DateTime horaFinal) { Process processo = new Process(); int i = 0; while (i < Segundos && continua == true) { Thread.Sleep(1000); DateTime horaInicial = DateTime.Now; i++; progressBar1.Value = i; lblMsg.Text = ("Restam apenas..: " + (horaFinal - horaInicial)); }