application is already running the dispatcher
*Remarque : l'exemple référencé n'est plus disponible depuis 2013. Un nouvel exemple de navigateur Web multithread présente une technique et un code similaires. Le premier problème : le thread créé s'exécutera en continu jusqu'à ce que l'application s'arrête, compte tenu du code de l'exemple. Le problème est que le délégué ThreadStart utilisé se termine par l'exécution du Dispatcher. Cependant, rien n’arrête jamais le traitement du Dispatcher.  Cependant, il arrive rarement que la création d’un thread distinct et dédié pour une fenêtre puisse être bénéfique. Ceci est même reconnu dans les exemples MSDN, tels que l'exemple Multiple Windows, Multiple Threads*. Cependant, il est difficile de le faire correctement. Généralement, dans une application MVVM Light, DispatcherHelper est initialisé dans App.xaml.cs, qui est le fichier définissant la classe de démarrage de l'application. Dans Windows Phone, vous appelez DispatcherÂHelper.Initialize dans la méthode InitializePhoneApplication, juste après la création du cadre principal de l'application.  Une dernière chose sur la classe Dispatcher est qu'une application donnée ne peut avoir qu'une seule instance de classe Dispatcher (car l'application s'exécute sur un seul thread), donc la classe Dispatcher implémente le très célèbre modèle « Singleton ». Pour cette raison, il est impossible de créer une instance de la classe Dispatcher dans notre code personnalisé. Run est appelé pour démarrer une application WPF. Si vous définissez votre application à l'aide du balisage, ou du balisage et du code-behind, Run sera appelé implicitement. Cependant, si vous définissez votre application à l'aide de code, vous devrez appeler explicitement Run. Lorsque Run est appelé, l'application attache une nouvelle instance de Dispatcher au thread de l'interface utilisateur. Ensuite, la méthode Run de l'objet Dispatcher est appelée, ce qui démarre une pompe de messages pour traiter les messages Windows. Enfin, l'objet Dispatcher appelle la méthode OnStartup de l'objet Application pour déclencher l'événement Startup.  Un bon exemple de cette tendance est le framework Windows Runtime utilisé dans les applications du Windows Store. Dans ces applications client modernes, les opérations asynchrones (opérations exécutées sur des threads en arrière-plan) sont très courantes. Par exemple, chaque accès à un fichier dans Windows 8 est désormais une opération asynchrone. Pendant l'exécution de l'application WPF, la classe Dispatcher accepte les requêtes entrantes et les exécute une par une. En bref, le répartiteur est un objet qui reçoit des messages et les transmet au bon objet pour un traitement ultérieur. La classe Dispatcher est assez dense avec de nombreuses propriétés et méthodes.  Le code ci-dessus en gras accomplit la tâche d'arrêter le répartiteur pour le thread d'interface utilisateur de Windows. L'exécution de plusieurs threads d'interface utilisateur dans une application WPF est en fait plutôt triviale. En résumé, cela revient à créer votre thread dédié et à créer vos fenêtres dans le processus de ce thread. N'oubliez pas de conclure votre fil de discussion d'interface utilisateur avec un appel au répartiteur WPF.  Comme son nom l'indique, cette méthode effectue d'abord une vérification. Si l’appelant de la méthode s’exécute déjà sur le thread principal, aucune répartition n’est nécessaire. Dans ce cas, le délégué est exécuté immédiatement, directement sur le thread principal. Toutefois, si l'appelant se trouve sur un thread d'arrière-plan, la répartition est exécutée. Le thread qui contrôle l’application est communément appelé UIThread. Le concept « Dispatcher » est un mécanisme introduit dans WPF, avec l'aide duquel le développeur peut avoir un contrôle plus explicite sur ce thread d'interface utilisateur quant à ce qui s'exécute et à quel moment. Nous examinerons cela plus en détail dans la section restante de cet article.
 MVVM Light et WPF.