Développer des interfaces réactives avec WPF
description
Transcript of Développer des interfaces réactives avec WPF
![Page 1: Développer des interfaces réactives avec WPF](https://reader035.fdocuments.net/reader035/viewer/2022062316/568163cc550346895dd50ba8/html5/thumbnails/1.jpg)
![Page 2: Développer des interfaces réactives avec WPF](https://reader035.fdocuments.net/reader035/viewer/2022062316/568163cc550346895dd50ba8/html5/thumbnails/2.jpg)
2
Développer des interfaces réactives avec WPF08/02/2011David CATUHEDirecteur généralBewiseEric Vernié Microsoft France
![Page 3: Développer des interfaces réactives avec WPF](https://reader035.fdocuments.net/reader035/viewer/2022062316/568163cc550346895dd50ba8/html5/thumbnails/3.jpg)
3
Développer des interfaces réactives avec WPF
Technologies de WPF pour l’asynchronisme
Introduction au Dispatcher de WPF
Comprendre le fonctionnement des interfaces Windows
![Page 4: Développer des interfaces réactives avec WPF](https://reader035.fdocuments.net/reader035/viewer/2022062316/568163cc550346895dd50ba8/html5/thumbnails/4.jpg)
4
Sommaire• La boucle de messages• WPF et le dispatcher• Outils pour la gestion du multi-threading• Contrôler ses threads• Binding et parallélisme
![Page 5: Développer des interfaces réactives avec WPF](https://reader035.fdocuments.net/reader035/viewer/2022062316/568163cc550346895dd50ba8/html5/thumbnails/5.jpg)
5
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
![Page 6: Développer des interfaces réactives avec WPF](https://reader035.fdocuments.net/reader035/viewer/2022062316/568163cc550346895dd50ba8/html5/thumbnails/6.jpg)
6
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
![Page 7: Développer des interfaces réactives avec WPF](https://reader035.fdocuments.net/reader035/viewer/2022062316/568163cc550346895dd50ba8/html5/thumbnails/7.jpg)
7
DémoComprendre ce qui se passe : Faire sa propre gestion des messages Windows en .NET
![Page 8: Développer des interfaces réactives avec WPF](https://reader035.fdocuments.net/reader035/viewer/2022062316/568163cc550346895dd50ba8/html5/thumbnails/8.jpg)
8
Sommaire• La boucle de messages• WPF et le dispatcher• Outils pour la gestion du multi-threading• Contrôler ses threads• Binding et parallélisme
![Page 9: Développer des interfaces réactives avec WPF](https://reader035.fdocuments.net/reader035/viewer/2022062316/568163cc550346895dd50ba8/html5/thumbnails/9.jpg)
9
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
![Page 10: Développer des interfaces réactives avec WPF](https://reader035.fdocuments.net/reader035/viewer/2022062316/568163cc550346895dd50ba8/html5/thumbnails/10.jpg)
10
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é
![Page 11: Développer des interfaces réactives avec WPF](https://reader035.fdocuments.net/reader035/viewer/2022062316/568163cc550346895dd50ba8/html5/thumbnails/11.jpg)
WPF et le dispatcher (code)Dispatcher.Invoke(DispatcherPriority.SystemIdle,
new Action(() => { … }));
![Page 12: Développer des interfaces réactives avec WPF](https://reader035.fdocuments.net/reader035/viewer/2022062316/568163cc550346895dd50ba8/html5/thumbnails/12.jpg)
12
DémoUtiliser la priorité du dispatcher pour faire « respirer » son application ou « Comment faire un Application.DoEvents en WPF »
![Page 13: Développer des interfaces réactives avec WPF](https://reader035.fdocuments.net/reader035/viewer/2022062316/568163cc550346895dd50ba8/html5/thumbnails/13.jpg)
13
DémoUtilisation du dispatcher pour gérer un wait panel
![Page 14: Développer des interfaces réactives avec WPF](https://reader035.fdocuments.net/reader035/viewer/2022062316/568163cc550346895dd50ba8/html5/thumbnails/14.jpg)
14
Sommaire• La boucle de messages• WPF et le dispatcher• Outils pour la gestion du multi-threading• Contrôler ses threads• Binding et parallélisme
![Page 15: Développer des interfaces réactives avec WPF](https://reader035.fdocuments.net/reader035/viewer/2022062316/568163cc550346895dd50ba8/html5/thumbnails/15.jpg)
15
Outils pour le multi-threading• Background Worker
• Encapsulation d’un travail asynchrone• Introduit par les Windows Forms• Utilisation du SynchronisationContext
(DispatcherSynchronizationContext )
![Page 16: Développer des interfaces réactives avec WPF](https://reader035.fdocuments.net/reader035/viewer/2022062316/568163cc550346895dd50ba8/html5/thumbnails/16.jpg)
16
Outils pour le multi-threading• DispatcherTimer
• Timer exécuté sur l’UI thread• Utilisation du dispatcher et de la priorité
![Page 17: Développer des interfaces réactives avec WPF](https://reader035.fdocuments.net/reader035/viewer/2022062316/568163cc550346895dd50ba8/html5/thumbnails/17.jpg)
17
Outils pour le multi-threading /Asynchronisme• TPL et ThreadPool
• Threads et ThreadPool• Gestion de base des threads du framework
• Task Parallel 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
![Page 18: Développer des interfaces réactives avec WPF](https://reader035.fdocuments.net/reader035/viewer/2022062316/568163cc550346895dd50ba8/html5/thumbnails/18.jpg)
18
Démoasync et await
![Page 19: Développer des interfaces réactives avec WPF](https://reader035.fdocuments.net/reader035/viewer/2022062316/568163cc550346895dd50ba8/html5/thumbnails/19.jpg)
19
Sommaire• La boucle de messages• WPF et le dispatcher• Outils pour la gestion du multi-threading• Contrôler ses threads• Binding et parallélisme
![Page 20: Développer des interfaces réactives avec WPF](https://reader035.fdocuments.net/reader035/viewer/2022062316/568163cc550346895dd50ba8/html5/thumbnails/20.jpg)
20
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
![Page 21: Développer des interfaces réactives avec WPF](https://reader035.fdocuments.net/reader035/viewer/2022062316/568163cc550346895dd50ba8/html5/thumbnails/21.jpg)
21
DémoChargement d’images sur le web
![Page 22: Développer des interfaces réactives avec WPF](https://reader035.fdocuments.net/reader035/viewer/2022062316/568163cc550346895dd50ba8/html5/thumbnails/22.jpg)
22
Sommaire• La boucle de messages• WPF et le dispatcher• Outils pour la gestion du multi-threading• Contrôler ses threads• Binding et parallélisme
![Page 23: Développer des interfaces réactives avec WPF](https://reader035.fdocuments.net/reader035/viewer/2022062316/568163cc550346895dd50ba8/html5/thumbnails/23.jpg)
23
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
![Page 24: Développer des interfaces réactives avec WPF](https://reader035.fdocuments.net/reader035/viewer/2022062316/568163cc550346895dd50ba8/html5/thumbnails/24.jpg)
24
DémoUtilisation du Binding.IsAsync
![Page 25: Développer des interfaces réactives avec WPF](https://reader035.fdocuments.net/reader035/viewer/2022062316/568163cc550346895dd50ba8/html5/thumbnails/25.jpg)
25
DémoMise en place d’un chargement asynchrone d’images dans un WrapPanel
![Page 26: Développer des interfaces réactives avec WPF](https://reader035.fdocuments.net/reader035/viewer/2022062316/568163cc550346895dd50ba8/html5/thumbnails/26.jpg)
26
MSDN et TechNet : l’essentiel des ressources techniques à portée de clic
http://technet.com http://msdn.com
Portail administration et infrastructure pour informaticiens
Portail de ressources technique pour développeurs
![Page 27: Développer des interfaces réactives avec WPF](https://reader035.fdocuments.net/reader035/viewer/2022062316/568163cc550346895dd50ba8/html5/thumbnails/27.jpg)