2013-02-12 1 views
1

J'essaie d'utiliser un modèle asynchrone basé sur les tâches dans mon application Windows Phone 8. L'idée est que toutes les opérations de longue durée font référence à un jeton d'annulation, et il y a un endroit dans l'application où tous ces jetons sont stockés. Lorsque l'application reçoit l'événement Deactivated, elle parcourt tous les jetons et les annule. Le problème est que le thread avec une opération longue durée n'est pas programmé pour s'exécuter lorsque l'application est désactivée, ce qui signifie que si j'essaye d'utiliser CancellationToken.ThrowIfCancellationRequested(); dans ce thread, il est seulement appelé quand l'application reprend, pas quand l'application se désactive . Et bien sûr ce n'est pas ce que je veux. Si je fais une astuce simple comme token.Register(() => Thread.Sleep(1000));, c'est-à-dire mettre en pause un fil qui appelle à l'annulation pour un moment, alors le deuxième fil a une chance de courir, et tout est annulé comme un charme. Cependant, c'est un hack sale et je ne veux pas l'utiliser dans mon application.Conditions de concurrence lors de l'annulation de tâches pendant la désactivation de l'application

La question est de savoir comment s'assurer que l'application ne se termine pas lorsque l'annulation de l'opération est terminée. Je suppose que le signe d'annulation coopérative est OperationCancelledException levé, mais comment l'attendre, surtout si je n'ai qu'une référence à CancellationTokenSource, mais pas à l'objet Task? Y a-t-il un autre moyen de le savoir?

Merci beaucoup d'avance!

P.S. Si vous avez besoin de plus de code pour m'aider, il suffit de demander.

+0

Pourquoi n'est-ce pas ce que vous voulez? Pourquoi est-ce important que l'opération ne soit effectivement annulée qu'après la reprise de l'application? – svick

+0

Mon thread de travail ne reçoit pas de notification sur l'annulation, c'est le problème. Il est supposé arrêter d'écrire dans un fichier et le fermer correctement à la demande d'annulation, puis lancer OperationCancelledException comme confirmation de l'annulation réussie. Si cela ne se produit pas avant la désactivation de l'application, le fichier peut être laissé dans un état inattendu, car l'application peut être désactivée après la désactivation. – Haspemulator

Répondre

0

Je pense stocker tous les CancellationToken s pas assez dans votre cas, vous devez également stocker le Task s. Dans votre gestionnaire Deactivated, vous devez ensuite annuler tous les jetons, puis await tous les Task s (en attrapant les OperationCancelledException s). (Je ne sais pas exactement comment Deactivated fonctionne avec async, vous pourriez avoir besoin de quelque chose pour faire savoir au système que vous n'avez pas encore fini de désactiver.)

+0

Merci, j'ai essayé, et je pense que ça devrait marcher. Cependant, j'ai un problème avec la mise en œuvre. Pensez-vous qu'il soit logique d'ajouter des détails à cette question ou d'en créer une autre? – Haspemulator

+0

D'accord, réussi à le faire fonctionner, merci! – Haspemulator

Questions connexes