WPF France

  • Augmenter la taille
  • Taille par défaut
  • Diminuer la taille

Pourquoi et comment créer plusieurs Thread/Dispatcher UI ?

Envoyer Imprimer PDF
Note des utilisateurs: / 1
MauvaisTrès bien 
Dans cet article nous allons étudier comment créer plusieurs Thread UI dans une application WPF.
 

Pourquoi ?

Une application WPF utilise un Thread UI (au travers du Dispatcher) responsable de faire le rendu de l'interface graphique.
Une bonne pratique est donc de faire tout traitement lourd et long sur un autre Thread que celui-ci afin de ne pas geler l'interface graphique. Cette bonne pratique n'est pas toujours simple à respecter et il existe des cas ou cela n'est pas possible du tout.

Dans une application composées de plusieurs fenêtres, un seul Dispatcher est utilisé par défaut et si une des fenêtres freeze alors toutes sont bloquées également. Ce comportement peut être génant mais il existe une solution: créér un Thread UI par fenêtre.

Attention, si ces Threads sont bloqués, les éléments graphiques sous leur responsabilité seront quand mêmes bloqués et c'est à utiliser qu'en cas de nécessité extrême !

Comment ? 

La solution consiste à créer la fenêtre dans un nouveau Thread et de lui assigner son propre Dispatcher.
Un Thread UI pour être valide doit avoir un ApartmentState à STA, cela est fait assez simplement dans le code ci-dessous. De même on assigner un Dispatcher en appelant la méthode statique Run sur la classe Dispatcher.
Finalement, il faut s'assurer de bien terminer ce Dispatcher lorsque l'on ferme la fenêtre. Ceci est fait en s'abonnant sur l'événement Closed de cette dernière pour appeler la méthode InvokeShutDown.

Voici l'extrait complet de code: 
private void OnCreateNewWindow(
   object sender,
   RoutedEventArgs e)
  {
   Thread thread = new Thread(() =>
    {
     Window1 w = new Window1();
     w.Show();

     w.Closed += (sender2, e2) =>
      w.Dispatcher.InvokeShutdown();

     System.Windows.Threading.Dispatcher.Run();
    });

   thread.SetApartmentState(ApartmentState.STA);
   thread.Start();
  }

A bientôt pour de nouvelles aventures !!
Commentaires (1)
Mise à jour le Mardi, 13 Septembre 2011 09:54  

Partagez


Article au hasard

  • Imaginons un scénario très simple: je dispose d’une interface graphique me permettant d’afficher une propriété, de type int mais étant en plus nullable.
    Si la valeur n'est pas affectée, rien n'est affiché une fois utilisé dans l'interface. Commentaires (0)...
    Lire la suite...