En utilisant .Net Framework 1.1, quelles sont les options disponibles pour surveiller les threads provenant d'autres threads? J'essaye de traiter une lacune de l'implémentation de threading dans 1.1 dans laquelle des exceptions non gérées feraient mourir les threads en silence. Dans 2.0 et plus tard cela a été corrigé de sorte que toute exception non gérée sur n'importe quel thread provoquera la mort de l'application entière, je crois. Lorsque les threads de mon application meurent, j'aimerais extraire autant de contexte que possible du thread principal: la méthode qu'ils exécutaient, une trace de pile, etc. Je peux déterminer quand ils meurent mais la récupération du contexte s'est avérée difficile . J'ai essayé d'enregistrer un gestionnaire pour l'événement AppDomain.CurrentDomain.UnhandledException
. Mais je ne suis pas rappelé quand les événements se produisent. Cela est probablement dû à une limitation de l'API pour laquelle je suis en train de développer. En plus de cet événement, quelles sont les options disponibles pour récupérer le contexte des threads lorsqu'ils meurent sur un autre thread?C# 1.1: Surveillance des threads de travail
Répondre
Comment créez-vous ces threads? Ajoutez-vous un délégué au pool de threads? Si tel est le cas, vous pouvez créer une méthode wrapper qui prend le délégué fourni et encapsule un autre délégué qui s'occupe de votre try/catch, puis ajoute ce nouveau délégué à la file d'attente du pool de threads. De cette façon, vous pourriez mettre votre code de gestion des erreurs dans ce second délégué.
C'est l'une des idées les plus intelligentes que j'ai entendues depuis longtemps. S'il n'y a pas d'autre moyen, je pourrais avoir à faire quelque chose comme ça. – Chris
Que diriez-vous d'un compte d'incrémentation pour chaque thread dans une carte indexée par l'ID de thread? Quand il arrête d'incrémenter, il est mort et il est temps de le tuer et/ou de le redémarrer. La carte peut contenir tout ce dont vous avez besoin pour gérer tout cela et partager des informations entre le thread d'hébergement et ces petits enfants méchants.
Je peux dire quand les threads meurent en vérifiant les propriétés Thread.IsAlive ou Thread.ThreadState. Le problème que j'ai est de détecter ce qui se passait dans les threads quand ils sont morts, après le fait, d'un autre thread. – Chris
Cela ressemble à un travail pour les fichiers journaux. – kenny
Je voudrais créer une méthode qui prendra la fonction de rappel vous passeriez normalement à un fil et alors qui a appelé à l'intérieur du code d'emballage que vous utilisez pour suivre des exceptions dans le fil, quelque chose comme ceci:
public class ThreadStarter
{
ThreadStart start;
public ThreadStarter(ThreadStart start)
{
this.start = start
}
public void Run()
{
// Create the thread.
Thread t = new Thread(new ThreadStart(InternalRun));
t.Start();
}
private void InternalRun()
{
// Wrap in a try/catch.
try
{
// Run the code.
start();
}
catch (Exception e)
{
// Process exception here.
}
}
}
Vous pouvez essayer d'ajouter un gestionnaire d'exception fil:
les System.Threading.ThreadExceptionEventArgs e contiendra les informations sur l'exception non gérée.
// Setup Default Thread Exception Handler
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
// Insert Code
}
Source: http://msdn.microsoft.com/en-us/library/system.windows.forms.application.threadexception.aspx
- 1. Débogage des threads C#
- 2. Les threads de travail arrêtent leur travail après un moment
- 3. ASP.NET Performance: threads de travail et d'E/S Threads
- 4. Vous recherchez des didacticiels sur les threads d'interface utilisateur et les threads de travail
- 5. Surveillance des crochets de bas niveau [C]
- 6. Utilisation des threads en C++
- 7. Comment déterminer le nombre optimal de threads de travail
- 8. Surveillance de l'avancement des travaux PowerShell
- 9. Surveillance des appels GDI
- 10. Surveillance des processus Windows
- 11. Attendez que tous les threads de travail pour mettre fin à
- 12. Surveillance de l'utilisation de l'interface réseau Linux en C/C++
- 13. Surveillance des fichiers non-pgp
- 14. C, HTTP 1.1 et Socket Envoyer des problèmes
- 15. Interruption des threads natifs
- 16. Surveillance des variables dans Xcode
- 17. Surveillance des erreurs de page pour Windows
- 18. Contrôle de la qualité/Surveillance des journaux
- 19. Suivi/surveillance des changements brusques de tendance
- 20. Surveillance des bibliothèques de sites Web
- 21. FireBug et surveillance des requêtes interdomaines JSONP
- 22. Surveillance de fichiers/dossiers
- 23. C: bibliothèque de threads POSIX test-suite
- 24. Comment paralléliser les threads dans C pthreads
- 25. C#, IAsyncResult et le pool de threads
- 26. Threads C# pour la manipulation de fichiers
- 27. Surveillance des appels d'application à la DLL
- 28. Clustering utilisant des threads en Java
- 29. Threads d'arrière-plan en C#
- 30. Planification des threads Swingworker
L'événement pour les exceptions de fil non capturé est Application.ThreadException. – VBNight