Comment pouvez-vous savoir qu'un Exception
a eu lieu dans un Thread
dans un MultiThreaded application? et nettoyer consécutivement les ressources? Parce que sinon le Thread peut encore rester en mémoire et en cours d'exécution.Attraper les exceptions dans un thread .NET
Répondre
Comme Sean a dit, vous devez faire tout le traitement des exceptions et le nettoyage dans la méthode de fil, vous ne pouvez pas faire dans l'initialisation Thread. Par exemple:
public void Run()
{
try
{
Thread thread1 = new Thread(ThreadEntry1);
thread1.Start();
Thread thread2 = new Thread(ThreadEntry2);
thread2.Start();
}
catch (NotImplementedException)
{
// Neither are caught here
Console.WriteLine("Caught you");
}
}
private void ThreadEntry1()
{
throw new NotImplementedException("Oops");
}
private void ThreadEntry2()
{
throw new NotImplementedException("Oops2");
}
Au lieu de cela, cette approche est plus autonome et, évidemment, fonctionne aussi:
public void Run()
{
Thread thread1 = new Thread(ThreadEntry1);
thread1.Start();
}
private void ThreadEntry1()
{
try
{
throw new NotImplementedException("Oops");
}
catch (NotImplementedException)
{
Console.WriteLine("Ha! Caught you");
}
}
Si vous voulez savoir si le thread a échoué, alors vous devriez envisager un tableau de WaitHandles et retournez à votre méthode d'appel. Une autre approche et plus simple consiste à augmenter simplement un compteur à chaque fois que le fonctionnement d'un fil se termine:
Interlocked.Increment(ref _mycounter);
A. Vous avez une pile d'appel, et vous pouvez l'attraper à l'intérieur du fil et ajouter l'identifiant de fil dans le journal ... Je suppose que
Si vous enveloppez votre fil d'une bonne façon, vous pouvez ajouter Cleaing code à la section catch, terminant le thread si nécessaire.
Si vous êtes inquiet à propos de ce genre de chose, alors vous devriez envelopper votre point d'entrée de thread dans un bloc try/catch et faire le nettoyage explicitement. Toute exception sortant du point d'entrée du fil entraînera l'arrêt de votre application.
Vous ne pouvez pas capturer ThreadAbortException dans .Net 3.5 ou version inférieure avec les paramètres par défaut et vous ne pouvez pas intercepter des exceptions qui pourraient représenter un état corrompu dans .Net 4.0, également avec les paramètres par défaut. Vous ne pouvez donc pas attraper toutes les exceptions avec un bloc try catch en utilisant les paramètres par défaut (ce n'est pas recommandé) –
Il ne lance pas ThreadAbortException sauf si vous annulez le thread - vous pouvez également les attraper, mais pas les avaler comme ils sont re-élevés automatiquement –
@Chris S, vous avez raison +1, j'ai utilisé capture avec le sens de la déglutition, ce qui n'est pas politiquement correct. –
Vous pouvez intercepter des exceptions dans les threads comme vous le feriez pour toute fonction normale. Si votre fonction « travail » pour un fil est appelé DoWork faire quelque chose comme ceci:
private void DoWork(...args...)
{
try
{
// Do my thread work here
}
catch (Exception ex)
{
}
}
Eric Lippert a une post récente sur le mauvais état des exceptions qui se produisent dans les discussions des travailleurs. Il vaut la peine de lire et de comprendre qu'une exception est "exceptionnelle" et la seule chose dont vous pouvez être sûr après une exception dans un thread de travail est que vous ne pouvez plus être sûr de l'état de votre application.
- 1. Attraper les exceptions polymorphically
- 2. Attraper toutes les exceptions Wordpress?
- 3. Attraper toutes les exceptions dans C#
- 4. Comment attraper toutes les exceptions dans un contrôle utilisateur
- 5. Android: attraper des exceptions java dans javascript
- 6. Comment attraper toutes les exceptions d'un WebService?
- 7. attraper des exceptions SQLAlchemy
- 8. Comment déboguer des exceptions inter-thread dans .NET?
- 9. Attraper plusieurs exceptions personnalisées? - C++
- 10. Comment attraper des exceptions dans FutureTask
- 11. Attraper la plupart des exceptions dérivées?
- 12. attraper des exceptions dans le balisage asp.net
- 13. Attraper des exceptions d'applet dans Firefox
- 14. comment puis-je attraper toutes les exceptions dans iphone?
- 15. Comment attraper des exceptions sur un autre thread sans affecter le débogueur
- 16. Bloquer un thread dans .Net
- 17. Attraper ASP.Net MVC principe Permission attribut exceptions
- 18. Quand et comment attraper des exceptions
- 19. Gestion des exceptions de thread dans WCF
- 20. Comment attraper des exceptions de gsoap?
- 21. gestion des exceptions dans l'environnement multi-thread
- 22. ASP Panneau de mise à jour, Attraper les exceptions
- 23. Attraper les exceptions levées à partir des DLL
- 24. Comment attraper des exceptions en javascript?
- 25. Attraper des erreurs ou des exceptions
- 26. Zend Framework: attraper les exceptions de savon personnalisé
- 27. Attraper les exceptions en valeur, référence ou pointeur
- 28. Attraper des exceptions par défaut en C++
- 29. Essayez Attraper - pas attraper
- 30. Lever des exceptions non gérées dans un thread dans le thread principal?
D'accord. Je ne vois pas cela comme un problème - vous commencez un fil, il va dans une de vos méthodes ... alors qu'est-ce qui vous empêche de gérer les exceptions là-bas? – TomTom