none
Carregar DataGridView com uma thred a cada 5 minutos RRS feed

  • 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

    segunda-feira, 7 de setembro de 2015 21:27

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
    terça-feira, 8 de setembro de 2015 11:09

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
    terça-feira, 8 de setembro de 2015 11:09
  • 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));                    
                       
                    }

    terça-feira, 8 de setembro de 2015 14:29