March 2008 - Posts
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
Hi Community,
This post is about avoiding the dreaded "Illegal Thread Call" exception in WPF, even when multi-threaded applications are harder to debug and maintain sometimes we need to implement some mechanism based on threads to refresh and update UI elements. WPF can't escape this fact as GDI can't either. Before delving into the details of how accomplish this it's a good time to talk a bit about WPF basics.
The Basics
WPF is a fundamental component in .NET Framework 3.0, along with WCF, WF and CardSpace. WPF is called to be the sucessor of techologies such as GDI and GDI+. GDI has been offering UI services since Windows 1.0 and throughout the years has grown in size and complexity. GDI+ its sucessor was introduced with Windows XP release, the difference between GDI and GDI+ is that the second one is entirely written in C++ and offers more capabilities. Microsoft has been working to offer developers a platform to ease and improve development while at the same time the syntax and way of coding to be the same, that's .NET Framework main purpose. Since .NET Framework 1.0 we've been able to create applications for Windows based on Windows Forms, a rich infraestructure that encapsulates GDI and GDI+, however we're still using UI elements we had 10 years ago, so Microsoft came up with a fresher and modern graphic engine based on DirectX. WPF (codename Avalon) was born. The image depicted below shows WPF main components (The sections in red are the major code portions of WPF). It's almost entirely written in managed code except for Milcore that's native so it enables a tight integration with DirectX.

In User32 and GDI the system works on an inmediate clipping mode (invalid areas) that need to be rendered, in the other hand WPF uses a "painter's algorithm" painting model, this means that instead of clipping each component, each component is rendered from the back to the front of the display. This allows each component to paint over the previous component's display. The advantage of this model is that we can have complex, partially transparent shapes and since it's executing on top of DirectX engine we can embed multimedia elements into UI objects as well. Another advantage found in WPF is the use of a declarative language to create UI elements, XAML. This allows the creation of astonishing UI by graphic designers and the logic behind it by developers.
Avoiding Illegal Thread Calls in WPF
What is an illegal thread call after all? This situation presents whether one tries to update any UI element, such a ListBox by manipulating its items collection from a thread different than the thread that owns the UI element. This is not permitted because the operating system can't guarantee the items collection integrity so it's up to the developer to do that.
In WPF we can find a new property in UI elements called "Dispatcher" that allows through the use of managed callbacks or delegates perform actions on UI elements without incurring in "Illegal Thread Calls".

Kind regards,
Angel
Hola Comunidad, han pasado dos meses desde que posteé aquí pero he estado realmente ocupado con un montón de cosas que van desde superar la diferencia de horas entre Venezuela y Australia, encajar dentro de mi nuevo equipo de trabajo, ejecutar las tareas asignadas de la compañía, leer bastante de WPF, Silverlight, AJAX y algunas cosas de bajo nivel (código nativo) con C++ y mucho más
... Sin embargo, actualmente me encuentro trabajando en dos proyectos bien interesantes que espero terminar pronto. Uno de ellos implementa WPF, WCF, Hilos, Generics y algo de C++ (Creo que ya he desarrollado un poco más del 30% de la aplicación hasta ahora), el otro trata de un webpart muy útil para administrar tres plataformas distintas al mismo tiempo (Equipos basados en Windows, SQL Server y Directorio Activo) también creo que está un poco más del 30% listo. Los publicaré tan pronto estén listo. Por favor, ténganme paciencia 
Saludos cordiales,
Angel
Hi community, it's been two months since I posted here but I've been pretty busy with a bunch of stuff that goes from overcoming the jet lag between Venezuela and Australia, to fit into my new working team, execute my assigned tasks at the office, reading a lot about WPF, Silverlight, AJAX and some low level (Native) stuff with C++ and a lot more
... However I'm currently working in parallel on two cool projects I hope to finish soon. One of them is about implementing WPF, WCF, Threads, Generics and some C++ (I think I have developed over the 30% of this application so far), the other is about... a very useful and handy webpart for managing three different platforms at the same time (Windows based PCs, SQL Server and Active Directory) I think it's over 30% developed as well. I'll publish them as soon as they are ready. Please bear with me 
Kind regards,
Angel