270 likes | 372 Views
Développer des interfaces réactives avec WPF. 08/02/2011 David CATUHE Directeur général Bewise Eric Vernié Microsoft France. Développer des interfaces réactives avec WPF. Sommaire. La boucle de messages WPF et le dispatcher Outils pour la gestion du multi-threading
E N D
Développer des interfaces réactives avec WPF 08/02/2011 David CATUHE Directeur général Bewise Eric Vernié Microsoft France
Sommaire • La boucle de messages • WPF et le dispatcher • Outils pour la gestion du multi-threading • Contrôler ses threads • Binding et parallélisme
La boucle de messages • Toutes les fenêtres sous Windows doivent avoir une boucle de messages: • Message Loop • Message Pump : récupération des messages • Moyen de communication entre l’OS et ses applicatifs
La boucle de messages • La boucle des messages tourne dans le même thread que le contrôle de l’UI dans WPF: • UI thread == message thread == thread principal • Si le thread principal est fortement chargé (ne « pompe » pas assez vite les messages), Windows le détecte et grise la fenêtre « Not responding » • Objectif: • NE PAS SURCHARGER L’UI THREAD • Donc : • Maximiser l’usage des threads • Utiliser tous les cœurs (CPU) disponibles
Démo Comprendre ce qui se passe : Faire sa propre gestion des messages Windows en .NET
Sommaire • La boucle de messages • WPF et le dispatcher • Outils pour la gestion du multi-threading • Contrôler ses threads • Binding et parallélisme
WPF et le dispatcher • Les applications WPF démarrent avec 2 threads • Une pour dessiner l’interface (rendering thread) • Une pour gérer l’interface (UI thread) • Tous les objets graphiques sont liés à l’UI thread (Thread affinity) et ne peuvent être manipulés que par ce thread • Le rendering thread n’est pas accessible à l’utilisateur • Le développeur WPF doit absolument: • Développer le moins de code possible sur l’UI thread • Paralléliser le plus possible • Penser à la « respiration » de l’UI thread
WPF et le dispatcher • Les objets graphiques (Visual) héritent tous de la classe DispatcherObject • Dispatcher : • Objet unique pour centraliser les accès à l’UI thread • Point d’entrée pour les autres threads • Point d’entrée vers la boucle des messages • Gestion de la priorité
WPF et le dispatcher (code) Dispatcher.Invoke(DispatcherPriority.SystemIdle, new Action(() => {… }));
Démo Utiliser la priorité du dispatcher pour faire « respirer » son application ou « Comment faire un Application.DoEvents en WPF »
Démo Utilisation du dispatcher pour gérer un waitpanel
Sommaire • La boucle de messages • WPF et le dispatcher • Outils pour la gestion du multi-threading • Contrôler ses threads • Binding et parallélisme
Outils pour le multi-threading • Background Worker • Encapsulation d’un travail asynchrone • Introduit par les Windows Forms • Utilisation du SynchronisationContext (DispatcherSynchronizationContext)
Outils pour le multi-threading • DispatcherTimer • Timer exécuté sur l’UI thread • Utilisation du dispatcher et de la priorité
Outils pour le multi-threading /Asynchronisme • TPL et ThreadPool • Threads et ThreadPool • Gestion de base des threads du framework • TaskParallel Library • Framework de programmation parallèle • Simplification de la concurrence, de la synchronisation et de l’écriture de code parallèle • Notion de tâches (Task) • Au final : encapsulation de threads systèmes donc nécessité de passer par le Dispatcher pour atteindre l’UI. • En Beta : • TPLDataflow : à base d’agent • CTP Asynchrone : async et await
Démo async et await
Sommaire • La boucle de messages • WPF et le dispatcher • Outils pour la gestion du multi-threading • Contrôler ses threads • Binding et parallélisme
Contrôler ses threads • « Trop de threads tue le thread » • Le framework fournit des outils pour contrôler ses threads: • TPL • Semaphore • Mutex • etc. • Tenir compte des limites des ressources: • Nombre de CPUs potentiels • Nombre de connexions réseau paralléles • Concurrence d’accès au matériel
Démo Chargement d’images sur le web
Sommaire • La boucle de messages • WPF et le dispatcher • Outils pour la gestion du multi-threading • Contrôler ses threads • Binding et parallélisme
Binding et parallélisme • Utilisation de la propriété Binding.IsAsync • Introduit par WPF 3.0 • Le binding retourne dans un premier temps la valeur FallbackValue • De manière asynchrone (sans bloquer l’UI thread) le binding va attendre le calcul de sa valeur • Gestion d’un binding asynchrone manuel • Threads • Dispatcher
Démo Utilisation du Binding.IsAsync
Démo Mise en place d’un chargement asynchrone d’images dans un WrapPanel
MSDN et TechNet: l’essentiel des ressources techniques à portée de clic • Portail administration et infrastructure pour informaticiens • Portail de ressources technique pour développeurs http://technet.com http://msdn.com