Share via


[Windows Phone 7] Multithreading et traitement des évènements Pause et Resume dans une application

Le Refresh d’Avril de la CTP des outils Windows Phone 7 introduit un nouvel espace de nommage, Microsoft.Phone.Execution. C’est dans cet espace de nommage qu’on va retrouver les éléments nous permettant de traiter la mise en background (pause) et le retour au premier plan (resume) d’une application.

Dans cet espace de nommage on trouve une classe statique: WindowsPhoneEvents. Cette classe contient les évènements Pause et Resume. Dans une application, que ce soit en XNA ou en Silverlight, il suffit donc d’ajouter un event handler à cet évènement pour gérer les passage en arrière ou en premier plan de l’application:

WindowsPhoneEvents.Pause += new EventHandler<PauseEventArgs>(WindowsPhoneEvents_Pause);

WindowsPhoneEvents.Resume += new EventHandler<ResumeEventArgs>(WindowsPhoneEvents_Resume);

Le code contenu dans le handler WindowsPhoneEvents_Pause sera exécuté avant la mise en background de l’application. Le code contenu dans le handler WindowsPhoneEvents_Resume sera exécuté après le retour au premier plan de l’application.

C’est typiquement à ce moment que vous disposerez d’un temps (court et borné) pour sauvegarder votre contexte: si vous avez énormément de chose à sauvegarder, penser à le faire régulièrement et de façon incrémentale!

Par ailleurs, une fois votre application en background, n’oubliez pas que le système se réserve le droit de la tuer purement et simplement afin de libérer des ressources mémoire. Dans ce cas là, vous ne recevrez pas d’évènement supplémentaire: toute votre sauvegarde de contexte doit donc être faite à la réception de l’évènement Pause!

Dernier point: il y a dans la CTP Refresh un bug dans l’émulateur, qui fait que si vous démarrez un thread séparé, celui-ci  n’est pas stoppé quand l’application passe en background: un compteur par exemple continuerai à compter! Cela implique par exemple la classe Timer…
il n’en sera pas ainsi pour la version finale des outils! Veillez donc bien à stopper vos threads et à les relancer manuellement pour être sur d’avoir la maitrise totale sur la sauvegarde du contexte: et ne pensez même pas à exploiter ce bug par exemple pour simuler du multitâche: d’abord, il sera fixé, ensuite, je vous rappelle que quand votre application est en background, elle peut se faire tuer, sans vous prévenir. Pas question dans ces conditions de se reposer sur ce bug pour coder une application sérieusement!