27

Développer des interfaces réactives avec WPF

  • Upload
    zody

  • View
    40

  • Download
    0

Embed Size (px)

DESCRIPTION

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 - PowerPoint PPT Presentation

Citation preview

Page 1: Développer des interfaces réactives avec WPF
Page 2: Développer des interfaces réactives avec WPF

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

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

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

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

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

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

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

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

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

WPF et le dispatcher (code)Dispatcher.Invoke(DispatcherPriority.SystemIdle, 

new Action(() =>                            {                               …                            }));

Page 12: Développer des interfaces réactives avec WPF

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

13

DémoUtilisation du dispatcher pour gérer un wait panel

Page 14: Développer des interfaces réactives avec WPF

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

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

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

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

18

Démoasync et await

Page 19: Développer des interfaces réactives avec WPF

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

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

21

DémoChargement d’images sur le web

Page 22: Développer des interfaces réactives avec WPF

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

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

24

DémoUtilisation du Binding.IsAsync

Page 25: Développer des interfaces réactives avec WPF

25

DémoMise en place d’un chargement asynchrone d’images dans un WrapPanel

Page 26: Développer des interfaces réactives avec WPF

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