Threads en WinForm con Invoke : Javier Luna blog

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.

No comments: