2009-02-06 5 views
0

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

+0

L'événement pour les exceptions de fil non capturé est Application.ThreadException. – VBNight

Répondre

4

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é.

+0

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

0

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.

+0

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

+0

Cela ressemble à un travail pour les fichiers journaux. – kenny

0

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. 
    } 
    } 
} 
1

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

Questions connexes