Angel Hernández

Evitando Llamadas Ilegales entre Hilos en WPF

Hola comunidad, 

Este post trata de cómo evitar la temida excepción de "Llamada Ilegal entre Hilos" en WPF, aún cuando las aplicaciones basadas en múltiples hilos son más díficiles de depurar y mantener en algunas ocasiones necesitamos implementar algún mecanismo basado en hilos para refrescar y actualizar elementos de la interfaz de usuario. WPF no puede escapar a este hecho como tampoco lo puede hacer GDI. Antes de adentrarnos en los detalles de como podemos lograr esto este es un buen momento para hablar un poco de WPF básico.

Lo Básico

WPF es un componente fundamental en .NET Framework 3.0, junto con WCF, WF y CardSpace. WPF está llamado a ser el sucesor de tecnologías como GDI y GDI+. GDI ha estado ofreciendo servicios de interfaz de usuario desde Windows 1.0 y con el paso de los años ha crecido en tamaño y complejidad. GDI+ su sucesor fue presentado con el lanzamiento de Windows XP,  la diferencia entre GDI y GDI+ es que el segundo está escrito enteramente en C++ y ofrece más capacidades. Microsoft ha estado trabajando para ofrecer a los desarrolladores una platafora que facilite y mejore el desarrollo mientras que al mismo tiempo la sintaxis y manera de codificar sea la misma, ese es el próposito principal del .NET Framework. Desde el .NET Framework 1.0 hemos podido crear aplicaciones para Windows basadas en Windows Forms, que es una rica infraestructura que encapsula GDI y GDI+, sin embargo aún utilizamos elementos de la interfaz de usuario que teníamos hace 10 años atrás, así que Microsoft presentó un motor gráfico más nuevo y moderno que está basado en DirectX. WPF (nombre código Avalon) había nacido. La imagen mostrada a continuación muestra los componentes principales de  WPF (Las secciones en rojo son las porciones de mayor código de WPF). Está casi escrito totalmente en código gestionado excepto por el Milcore que es código nativo lo cual permite una fuerte integración con DirectX.

En User32 y GDI el sistema trabaja en un modo de recorte inmediato (áreas inválidas) que deben redibujarse, en la otra mano WPF utiliza un modelo de dibujo basado en "algoritmo de pintor", esto quiere decir que en vez de recortar cada componente, cada componente es dibujado de atrás hacia adelante. Esto permite a cada componente pintar sobre la representación previa del componente. La ventaja de este modelo es que podemos tener formas complejas, parcialmente transparentes y ya que se ejecuta sobre le motor de DirectX podemos incrustar elementos de multimedia en objetos de la interfaz de usuario también. Otra ventaja encontrada en WPF es la utilización de un lenguaje declarativo para crear elementos de la interfaz de usuario, XAML. Esto permite la creación de sorprendentes interfaces de usuario por diseñadores gráficos y la lógica tras estas por parte de los desarrolladores.

Evitando Llamadas Ilegales entre Hilos en WPF

Qué es una llamada ilegal entre hilos después de todo? Ésta situación se presenta sí uno trata de actualizar algún elemento de la interfaz de usuario, como un cuadro de lista al manipular su colección de elementos desde un hilo distinto al que ejecuta el elemento de interfaz de usuario. Esto no es permitido porque el sistema operativo no puede garantizar la integridad de la colección de elementos de manera que le corresponde al desarrollador hácerlo.

En WPF podemos encontrar una nueva propiedad en los elementos de interfaz de usuario llamada "Dispatcher" que permite a través de punteros a funciones gestionados ó delegados realizar acciones en elementos de la interfaz de usuario sin incurrir en "Llamadas Ilegales entre Hilos".

Saludos cordiales,

Angel

Leave a Comment

(required) 

(required) 

(optional)

(required)