jueves, 2 de abril de 2009

Por fin, las cuatro certificaciones de SharePoint

Hace algo más de dos años decidí certificarme en SharePoint 2007 aprovechando una oferta que me permitía realizar, sin coste, cada uno de los cuatro exámenes de certificación sobre esta tecnología cuando todavía se encontraban en versión beta. De los cuatro exámenes aprobé tres y suspendí uno (Configuring WSS 3.0), lo cual era más que aceptable, dado el poco tiempo que llevaba trabajando con el producto. La idea de sacarme esta cuarta certificación se quedó en el aire, en espera de encontrar un momento libre. Pues bien, ese momento libre ha llegado hoy. A partir de ahora ya puedo decir que tengo las cuatro certificaciones relacionadas con SharePoint 2007 que, unidas a las certificaciones en SharePoint 2003 y ASP.NET que poseía anteriormente completan un perfil bastante acorde con el trabajo que he venido realizando estos últimos años.

WSS 3.0 Application Development
WSS 3.0 Configuring
MOSS 2007 Application Development
MOSS 2007 Configuring

La decisión de obtener ahora esta certificación no ha sido casual. En los tiempos que corren, y tranquilos que no voy a comentar nada acerca del entorno económico en el que nos encontramos -para eso ya hay mucha gente que entiende-, considero que es el momento de invertir en aquellas cosas que en otras épocas se tienen más en el olvido. En mi opinión es importante aprovechar estas épocas de parón generalizado para diferenciarte del resto de un modo u otro para aprovecharlo en el momento en que las cosas vuelvan a la normalidad. En fin, esperemos que esto no quede aquí y vuelvan a pasar dos años para el próximo pasito...

martes, 31 de marzo de 2009

WPF y threading

Tras muchos años de desarrollo prácticamente exclusivo para entorno web, el proyecto basado en Surface en el que estoy trabajando actualmente ha hecho que algunas de las palabras que tenía archivadas en las zonas más oscuras de mi cerebro hayan tenido que ser recuperadas. Una de ellas era threading.

El elemento a desarrollar era teóricamente sencillo. Un flujo en segundo plano que actualizase el mapa de Virtual Earth que tenía en primer plano. Lo primero que tenía que hacer es ejecutar un flujo más o menos de la siguiente manera:

Threading.MapController controller = new Threading.MapController();
controller.Container = this;
App.ControllerThread = new Thread(new ThreadStart(controller.Run));
App.ControllerThread.Start();

Después, a la hora de implementar el método Run de la clase MapController, lo primero que se me podía ocurrir era algo similar a lo siguiente:

public void Run()
{
   while (true)
   {
      Thread.Sleep(100);
      this.Container.RefreshMap();
   }
}

Independientemente de la utilidad de este flujo y de las maneras de implementarlo me llamó la atención una excepción que saltaba siempre:

The calling thread cannot access this object because a different thread owns it.

Al parecer, desarrollando sobre WPF no se puede acceder a objetos que están controlados por un flujo distinto al actual. En este caso, desde el flujo que hemos lanzado en segundo plano se intenta acceder al objeto contenedor del mapa que, obviamente, está controlado por el flujo principal.

Tras un poco de investigación descubrí una manera muy simple de hacer lo que pretendía hacer. Aquí os dejo el trozo de código que resolvió el entuerto.

public void Run()
{
   while (true)
   {
      Thread.Sleep(100);
      this.Container.Dispatcher.Invoke(
         System.Windows.Threading.DispatcherPriority.Normal,
         new Action(delegate()         
            {
                this.Container.RefreshMap();         
            }
      ));  
   }
}

La clave está en utilizar el Dispatcher que tenemos disponible en cada uno de los controles WPF para ejecutar el código que accede a dicho objeto.