El form se congela cuando añado un row a mi datagriview.

Iniciado por nevachana, 7 Septiembre 2015, 14:57 PM

0 Miembros y 1 Visitante están viendo este tema.

nevachana

Hola   :) , tengo un problema,cuando añado varios rows a mi datagridview en poco tiempo,el form crashea.

1. Para acceder desde otras clases al form tengo una variable,a la cual le doy un valor cual el form carga.
Código (csharp) [Seleccionar]
   private void Form1_Load(object sender, EventArgs e)
        {
            Tools.doubleForm = this;
}

2. Después,cada vez un cliente se conecta a mi servidor lo añado al grid.

Código (csharp) [Seleccionar]
Tools.updateUsersForm("Client", ip, Tools.GetCountry(ip), "ok", "windows");


  public static void updateUsersForm(string name, string ip, string country, string status, string os)
        {
            doubleForm.editGrid(name, ip, country, status, os);       
        }



  public void editGrid(string name, string ip, string country, string status, string os)
        {
             this.zombieGrid.Rows.Add(new string[]{name,ip,country,status,os});
           
        }


Será que doy muchas "vueltas"?
Gracias.

kondrag_X1

ami me pasó lo mismo y lo solucioné añadiendo un delegado cuando añado una fila.

nevachana

Cita de: kondrag_X1 en  7 Septiembre 2015, 21:02 PM
ami me pasó lo mismo y lo solucioné añadiendo un delegado cuando añado una fila.

Nunca lo he usado,me darías un ejemplo?

Eleкtro

#3
En el título mencionas que se congela (se freezea) pero luego mencionas que se crashea (se finaliza anormálmente el proceso). ¿Puedes aclarar qué es lo que ocurre realmente de esas dos cosas?.

Que se congele el Form sería lo más normal, ya que si tienes el control en el thread de la UI y realizas una operación "intensiva", hasta que no termine lo que hagas en el control no puede seguir de forma regular el flujo de la UI.

Prueba a añadir los elementos de forma asíncrona en el mismo hilo, o añadir los elementos desde un hilo distinto, ambas metodologías deberían solucionar el problema del freezing.

Un ejemplo:
Código (vbnet) [Seleccionar]
Imports System.Threading.Tasks

Task.Factory.StartNew(Sub()
                         Me.zombieGrid.Añadir...)
                     End Sub)


En C#
Código (csharp) [Seleccionar]
using System.Threading.Tasks;

Task.Factory.StartNew(() => { this.zombieGrid.Añadir...; })


Saludos








nevachana

Cita de: Eleкtro en  7 Septiembre 2015, 23:10 PM
En el título mencionas que se congela (se freezea) pero luego mencionas que se crashea (se finaliza anormálmente el proceso). ¿Puedes aclarar qué es lo que ocurre realmente de esas dos cosas?.

Que se congele el Form sería lo más normal, ya que si tienes el control en el thread de la UI y realizas una operación "intensiva", hasta que no termine lo que hagas en el control no puede seguir de forma regular el flujo de la UI.

Prueba a añadir los elementos de forma asíncrona en el mismo hilo, o añadir los elementos desde un hilo distinto, ambas metodologías deberían solucionar el problema del freezing.

Un ejemplo:
Código (vbnet) [Seleccionar]
Imports System.Threading.Tasks

Task.Factory.StartNew(Sub()
                         Me.zombieGrid.Rows.Add(New String() {name, ip, country, status, os})
                     End Sub)


En C#
Código (csharp) [Seleccionar]
using System.Threading.Tasks;

Task.Factory.StartNew(() => { this.zombieGrid.Rows.Add(new string[] {name,ip,country,status,os}); })


Saludos
Las dos cosas,si añado varios a la vez se congela un rato,pero si añado muchos( unos 30) crashea.
Gracias por el ejemplo ^^

kondrag_X1

nevachana cuando se te congela es cuando se llena el datagridview???