J'ai obtenu TargetInvocationException lors d'un long processus dans un autre thread causé par un contrôle Windows sur le thread UI (barre de progression). Cette exception conduit mon application à planter (va à la méthode principale dans le débogage) et n'a pas pu être attrapée par try catch. J'ai trouvé ce qui fait cette exception, et la corrige (qui essayait d'assigner la propriété "Value" par une valeur qui dépasse le maximum). Mais cela m'a fait me demander comment je pouvais attraper une telle exception (dans le code de production), donc j'ai une option pour récupérer mon application au lieu de terminer l'application.Comment récupérer gracieusement à partir de TargetInvocationException dans multi thread?
Répondre
Il y a des chances que vous ne puissiez pas récupérer beaucoup. En termes de fonctionnement, l'état d'un bon nombre de cadres de pile (et d'objets référencés à partir de ces cadres de pile) est probablement invalide à cause de l'erreur. Pour cette raison, au mieux, vous pouvez récupérer à un niveau très élevé et recommencer l'opération.
Si les ressources auxquelles vous accédez peuvent être contenues dans une transaction, je vous suggère de le faire, afin de ne pas avoir à vous soucier des incohérences dans les données persistantes.
En outre, vous pouvez consulter ce fil sur SO:
Best Practice for Exception Handling in a Windows Forms Application?
Outre la Gestion des exceptions bloc d'application de Microsoft:
Intercepter l'exception et trouver un mécanisme pour le renvoyer au code principal ou appelant.
Vous pouvez gérer les exceptions (en fait, vous recevez juste une notification) sur le thread graphique via l'événement statique Application.UnhandledException
. Lorsque vous attachez un gestionnaire à cet événement, il sera appelé pour toutes les exceptions non gérées sur le thread WinForms UI (pompe de message). Le fait que vous ayez ce gestionnaire attaché signifie que le Application
ne se fermera pas. Sans cela, WinForms arrête votre application.
Vous ne savez pas quelle version de .net vous utilisez si elle est 3.0+, vous pouvez faire quelque chose le long de ces lignes.
private void UpdateValue(int newValue)
{
Action myAction =() => progressBar.Value = newValue;
if (progressBar.InvokeRequired)
progressBar.Invoke(myAction);
else
myAction();
}
Appelez cette méthode avec la nouvelle valeur de la barre de progression, il vérifiera si les besoins d'appels de triage et faire l'appel approprié. Attention, InvokeRequired est relativement cher, alors utilisez-le uniquement si nécessaire. Vous pouvez en faire une méthode d'extension pour utiliser génétiquement ce modèle pour d'autres contrôles si nécessaire.
Espérons que cela aide.
@Dean: l'exception n'est pas provoquée par l'accès au thread d'interface utilisateur de l'autre thread, cette situation est implémente correctement. quand, disons appeler (myAction) dans votre exemple là où l'exception jeté et n'a pas pu être capturé. Essayez-le et voyez ... merci –
- 1. Verrouillage et multi-thread dans dotNet
- 2. Programmation OpenGL multi-thread dans Cocos2D-iPhone
- 3. Récupérer un PK multi-colonne dans MySQL
- 4. Java Multi problème de synchronisation de thread?
- 5. Quelles situations multi-thread dans Rails
- 6. Le meilleur moyen de multi-thread?
- 7. Accès à la même chaîne (StringBuilder) à l'aide multi-thread
- 8. asp.net mise à jour en utilisant l'interface utilisateur multi-thread
- 9. thread automatique à partir de tomcat
- 10. VB.Net (ou C#) 2008 Multi Thread Import
- 11. ExecuteXmlReader et null Resultset Lance TargetInvocationException
- 12. Manipulation d'un thread à partir d'un thread différent
- 13. Question multi-thread - ajout d'un élément à une liste statique
- 14. Comment écrire un service WCF multi-thread transactionnel consommant MSMQ
- 15. Invoquer à partir de thread différent
- 16. Multi-thread FFTW 3.1.2 sur un ordinateur à mémoire partagée
- 17. Thread WPF et GUI comment accéder à l'objet à partir de thread différent?
- 18. Comment ajouter des tests pour un support multi-thread?
- 19. Récupérer max enregistrements à partir de sqlserver
- 20. Récupérer l'architecture à partir de Java
- 21. Récupérer la pile d'appel de n'importe quel thread à l'intérieur de C
- 22. Comment créer un panneau de mise à jour ajax multi-thread asp.net?
- 23. simple Asynchronous bibliothèque de requête HTTP multi-thread pour
- 24. Arrêter gracieusement NSXMLParser?
- 25. comment puis-je tuer gracieusement processus serveur rassis Postgres
- 26. Python Subprocess.Popen à partir d'un thread
- 27. Récupérer des variables GET à partir de l'URL dans ASPX
- 28. Écrire dans un TextBox à partir d'un autre thread?
- 29. Récupérer des clients à partir de projets L'utilisateur appartient à
- 30. Comment récupérer DataColumn.DefaultValue à partir d'une table Sql?
@casperOne: "En termes de fonctionnement, l'état d'un bon nombre de cadres de pile (et d'objets référencés à partir de ces cadres de pile) est probablement invalide à cause de l'erreur." cela semble le facteur le plus possible, dans mon cas l'exception avait été lancée plus de 600 fois à plusieurs reprises. –