Showing posts with label thread. Show all posts
Showing posts with label thread. Show all posts

Friday, January 09, 2009

Usando Threads con parametros

Utilizar Threads brota a la necesidad de ejecutar multiples operaciones relativamente pesadas.

Pesadas en el sentido que el tiempo para concluir su ejecucion, es relativamente indeterminado. Es decir, la aplicacion NO puede quedarse a la espera de que concluya dicha operacion sin que el usuario quede inhabilitado de continuar usando el software.

Los Threads permiten una solucion a esta necesidad.

Sin embargo, como toda operacion siempre se requerira de una especie de parametrizacion, es decir, enviarle una serie de parametros para que se ejecute con ciertas variables inicializadas previamente.

¿Que hacer ante este requerimiento? ¿Como puedo pasarle parametros a un metodo corriendo sobre un Thread?

Un metodo extenso, es casi siempre una potencial clase, es decir un class, que podras encapsular de la manera que mejor creas conveniente.

Aquel metodo relativamente extenso y pesado, podra ser abstraido a una clase, a la cual expondras un metodo publico sin parametros: Run, por ejemplo.

El constructor de la clase, tendra todos los parametros necesarios que requiera esa operacion relativamente pesada.

Entonces, tu instanciaras un objeto de dicha clase, y colocaras sobre un Thread el metodo Run de aquella class.

MyClass o = new MyClass( param1, param2 )
Thread t = new Thread( o.Run );
t.Start();

Este mecanismo te brindara la solucion a tus problemas.

Por otro lado, existe una clase propia del .NET Framework llamada ParameterizedThreadStart pero como todo lo que esta disponible para usar en el .NET Framework, tiene un costo, perder el control sobre la ejecucion interna de la operacion sobre el Thread.

Algo que a la primera, puede que NO le tomes la minima importancia, pero que luego, conforme van madurando el producto de software, este debe ajustarse a mas necesidades que la inicialmente indicadas.

Por lo que perder el control, tendra un costo mas alto despues.

Ese despues, esta solo a la vuelta de la esquina. NO lo dudes!

Wednesday, November 28, 2007

Threads en WinForm con Invoke

Cuando trabajas con Windows Forms todo es maravilloso. Pues la misma tecnologia esta orientada hacia una mayor interactividad con el usuario y el producto de software.

Asunto que en el desarrollo de aplicaciones web y ASP.NET se viene superando gracias al aporte de AJAX.

Sin embargo, dentro del mundo de Windows Forms tenemos ciertos retos, así le gusta calificar las dificultades a Frank Alexander Van Ede.

Uno de estos retos sucita cuando te encuentras con ciertas operaciones, tras el click del usuario, que han de tomar un tiempo prolongado y que ha la vez van pintando informacion en el front-end. Hablamos de varios segundos e inclusive algunos minutos.

Ante esta situacion, si se sigue realizando la programación de forma tradicional, pues te percataras que tu aplicativo empieza a tener un LAG, todo empieza a pintarse de blanco y el software ya no responde a las acciones del usuario. ¿Que hacer?

La solucion inmediata pasar por utilizar los Threads.

Sin embargo al usar los Threads, el mayor reto esta enviar los resultados parciales que va obteniendo esta supuesta operacion lenta y parsimoniosa hacia el front-end teniendo como destino muy probablemente un DataGrid u otro control, cuales quiera que sea. Ese es el meollo del asunto.

Recordemos que nuestro aplicativo WinForm se ejecuta en un espacio de memoria. Y un Thread se ejecuta en un espacio de memoria distinto, a pesar que este haya sido inicializado desde el WinForm. Cada Thread crea su propio espacio de memoria y se ejecuta en este.

Entonces el gran reto es, enviar resultados parciales de una operacion que se encuentra en su propio espacio de memoria distinto, hacia un control de usuario que se haya dentro de otro espacio de memoria, el del aplicativo.

Los Delegates son la solucion para este reto. Una especie de Broker que debe implementarse con la intención de ser el nexo entre ambos espacios de memoria.

El Thread notificará a traves de un Delegate una acción con ciertos datos y del lado del espacio de memoria del aplicativo nos suscribiremos al Delegate de dicho Thread con la intención de coger los datos que nos envien.

Al momento de asignar estos resultados parciales al control de usuario que hayamos decidido utilizar para mostrar los datos, debemos procurar llamar al metodo Invoke.