Appel d’un Dispatcher à partir d’une librairie

Lorsque l’on veut créer une librairie de type Helper, il est parfois intéressant de faire appel à des éléments du thread UI (MessageBox par exemple) . Malheureusement si la librairie est appeler à partir d’un Thread autre que celui de l’interface graphique on obtient un fatidique : Invalid thread cross access.

Il faudrait utiliser la méthode BeginInvoke de la classe Dispatcher. La classe Dispatcher ne possède pas de constructeur publique. Nous ne pouvons donc pas l’instancier. Classiquement, on accède au Dispatcher via une propriété d’un DependencyObject ou ses classes héritées UIElement, FrameworkElement,… Mais dans le cadre de notre librairie, il n’y a pas nécessairement de control lié à l’interface graphique, sous la main.

La solution consiste à utiliser le Dispatcher de la classe Deployment de la manière suivante :

   Deployment.Current.Dispatcher.BeginInvoke( () =>
     {
        // Truc à faire sur le thread UI
     }
   );

Assez simple finalement…

leave your comment