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. p>
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. P>
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. P>
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 p>
3 Réponses :
à un niveau élevé, la méthode wait code> prend simplement l'exception code> code> qui s'est produite dans le fil d'arrière-plan, les enveloppe dans une autre exception code> type code>. ce. Vous pouvez donc observer l'exception d'origine
code> sur le thread d'arrière-plan avec une norme
try / attraper code> Bloc entourant votre code logique. p>
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 P>
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() );
C'est vraiment une bonne fonctionnalité! Merci