none
inicializar los componentes de windows forms en otro hilo de ejecucion

    Question

  • hola buenas tengo una duda inquietante acerca de los hilos de ejecucion

    quiero que los componentes de mi formuario arranquen en otro hilo de ejecucion y , en el hilo principal seguir con el flujo, osea tengo en mi constructor de form

    public frm1(int id,bool nuevo)

    {

        Thread hilo=new Thread(InitializeComponent);

       hilo.Start();

                if (nuevo)
                    vector = new vector[53];
                else
                {
                    vector = new Logica.Servicios.ServicioDeVector().retornar(id);
                    dibujarEstados(vector);
                }

    }

    lo que resulta que me arroje una exepcion en el diseñador del formulario del tipo InvalidOperationException

    con la descripcion: Cross-thread operation not valid: Control '' accessed from a thread other than the thread it was created on.

    en la linea cuando dimensiona el form:this.ClientSize= new System.Drawing.Size(1174, 455);

    al principio tiene que dibujar muchos controles y se demora en el hilo principal, por eso lo quiero hacer en otro hilo al initializecomponent()

    gracias saludos

    Friday, September 27, 2013 11:46 PM

All replies

  • Hola.

    Para poder modificar las propiedades de los controles del formulario dentro de un Thread debes hacerlo mediante invocación.

    En el enlace que te paso a continuación podrás ver un ejemplo

    Como crear un reloj regresivo en C#

    Espero que te sea útil.

    Un Saludo.-


    Saturday, September 28, 2013 12:12 AM
  • no entiendo man, no entiendo ese post que me pusiste y no entiendo el problema que estoy teniendo con el hilo nuevo que quiero hacer, hay 5500 lineas de codigo en el diseñador de mi form, y le toma mucho dibujar todo, no entiendo porque no me funciona el hilo nuevo.
    Saturday, September 28, 2013 2:18 AM
  • Hola.

    Perdona por no haber sido mas claro en mi respuesta.

    Para modificar las propiedad 'ClientSize' de tu formulario, debes hacerlo mediante la siguiente sentencia:

    this.Invoke((MethodInvoker)(() => this.ClientSize = new System.Drawing.Size(1174, 455)));

    Prueba a ver si te funciona.

    Un Saludo.-

    Saturday, September 28, 2013 7:58 AM
  • Hola, El problema puede estar en que al correr el hilo que utiliza el InitializeComponent se ve afectado por el hilo principal de la app (Main) por lo que puede ocurrir este tipo de problema, de hehco por eso mismo aparece el Cross-thread operation not valid, te recomendaria que el InitializeComponent si pienesas utilizarlo solo en el hilo, quites los otros Initialize component de otras partes para que no se ejecute. Suerte, espero sea de tu ayuda.
    Saturday, September 28, 2013 4:16 PM
  • no tengo otros metodos InitializeComponent, solamente tengo uno solo y es el que quiero que se genere en otro hilo de ejecucion, lo que el hilo principal de la app(main) sigue haciendo es, buscar un paciente en la base de datos y traerlo devuelta, y ya para eso tendrian que generarse todos los componentes del formulario en el otro hilo, entonces me ahorro tiempo y no tengo q esperar q se clave mi aplicacion cuando esta ejecutando las 5500 lineas del diseñador usando un hilo principal,

    hay alguna otra forma de hacer varias cosas a la vez? ó solo es la unica forma? no quiero que se demore tanto en diseñarse los componentes, no quiero dejar al usuario esperando 5 segundos, eso le debe molestar, mas encima si tiene q buscar datos en la BD y cargar esos datos en el diseño que demora 5 segundos en generarse
    Thursday, October 03, 2013 6:18 AM
  • La demora es inevitable, ya que depende del resultado de la base de datos. Lo que se puede hacer es un método asíncrono que vaya hasta la base de datos, y mientras eso ocurre poner una barra de progreso para hacerlo mas ameno para el usuario. Luego implementar caching, para que la próxima vez que se consulte el paciente la información se cargue desde la memoria y no tenga que ir hasta la base de datos.

    http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx implementar método asíncrono para ir hasta la base de datos

    implementar caching http://geeks.ms/blogs/jorge/archive/2009/11/04/191-c-243-mo-usar-caching-en-una-aplicaci-243-n-windows-wpf-o-winforms.aspx

    Saludos!!!


    Juan Manuel Gómez Meza Analista Desarrollador C#

    Thursday, October 03, 2013 3:25 PM