11
votes

Exception de manutention avec TPL sans attendre ()

J'ai une application avec des boutons de démarrage et d'arrêt, et un fil qui est couru en arrière-plan après avoir appuyé sur Démarrer. J'utilise MVC et TPL pour cela.

Comment puis-je gérer une exception dans la TPL, car je n'envoyez jamais une méthode d'attente ()? Sur toute exception, je dois afficher la zone de message d'erreur et cette case doit être affichée après saillie immédiate.

J'ai toujours un seul fil à l'arrière-plan, vous ne pouvez donc pas appuyer sur Démarrer sans arrêter auparavant le fil.

Je cherche de bons modèles ou de meilleures pratiques. J'ai une idée de placer TRY..Catch Inside Whle et d'invoquer un événement sur chaque capture, mais je ne suis pas sûr que cette approche est une bonne décision d'architecture


0 commentaires

3 Réponses :


3
votes

à un niveau élevé, la méthode wait prend simplement l'exception qui s'est produite dans le fil d'arrière-plan, les enveloppe dans une autre exception type . ce. Vous pouvez donc observer l'exception d'origine sur le thread d'arrière-plan avec une norme try / attraper Bloc entourant votre code logique.


0 commentaires

2
votes

Il n'y a rien de mal à gérer l'exception dans la tâche (sur le fil de fond). Si vous devez afficher l'interface utilisateur en cas d'exception, vous pouvez utiliser le répartiteur (en supposant que vous utilisez WPF ou Silverlight): http://msdn.microsoft.com/en-us/magazine/cc163328.aspx


0 commentaires

24
votes

Si vous utilisez les tâches code> code>, vous pouvez ajouter une suite qui ne fonctionne que si une exception est lancée. Vous pouvez également le dire de fonctionner sur votre fil d'interface utilisateur afin que vous puissiez utiliser vos contrôles d'interface utilisateur:

task.ContinueWith(
    t => { var x = t.Exception; ...handle exception... },
    CancellationToken.None,
    TaskContinuationOptions.OnlyOnFaulted,
    TaskScheduler.FromCurrentSynchronizationContext()
);


1 commentaires

C'est vraiment une bonne fonctionnalité! Merci