2010-03-04 2 views
5

J'ai un thread de travail qui est vital pour mon application.
Il est créé avec new Thread(method).Start(); Je ne le rejoins pas, je m'attends juste à ce qu'il fonctionne tant que mon programme s'exécute.
Cependant, il peut arriver qu'une exception soit interceptée sur ce thread; et en conséquence, le thread sera (à côté de la dernière connexion) arrêt. Une récupération n'est pas possible pour cette erreur critique. Depuis le fil est vital pour l'application, il doit également fermer.Comment surveiller un thread de travail vital

Maintenant, ma question est: Comment puis-je surveiller l'état de mon thread?

Souhaitez-vous

  • Poll la propriété IsAlive? Repousser l'exception interceptée et travailler avec AppDomain.CurrentDomain.UnhandledException?
  • mettre en œuvre un event qui signalera la fin de mon fil d'arrière-plan?
  • utiliser un BackgroundWorker, qui implémente RunWorkerCompleted? (Mais un BackgroundWorker est-il vraiment le bon choix pour les longs threads?)
  • quelque chose de complètement différent?

EDIT:
En ce moment, je résolu le problème en appelant Application.Exit() ->accident tôt et souvent. C'est une option aussi :)

Répondre

2

Pourquoi ne pas envelopper votre routine principale de fil comme celui-ci:

void ThreadStart() 
{ 
     try 
     { 
      ThreadImplementation();   
     } 
     catch (Exception e) 
     { 
      mainForm.BeginInvoke(OnBackgroundThreadException, e); 
     } 
} 

Cela fera en sorte que vous obtenez un message sur le thread principal de l'application à chaque fois que le fil fait un anormal fermer. Vous n'avez pas besoin d'interroger quoi que ce soit. Un BackgroundWorker est généralement utile lorsque vous devez revenir au thread d'interface utilisateur de manière asynchrone. (I.E. mises à jour de progrès).

+0

Mais je besoin d'une référence à un contrôle - uniquement pour ce purpuse:/ – tanascius

+0

Un contrôle est un moyen pratique d'exécuter du code sur le thread de l'interface utilisateur. Pas nécessairement le seul moyen. Habituellement, vous avez besoin de revenir à un moment donné, j'ai tendance à préférer le plus tôt possible. –

2

A la fin du gestionnaire d'exception de votre thread, appelez une méthode de rappel sur votre thread principal et redémarrez le travailleur:

public delegate void AbnormalExitDelegate(object errorArgs); 

class Boss 
{ 
    Worker worker; 
    void Start() 
    { 
     worker = new Worker(); 
     worker.AbnormalExitCallback = new AbnormalExitDelegate(AbnormalExit); 
     Thread workerThread = new Thread(worker.DoWork); 
     workerThread.Start(); 
    } 
    public void AbnormalExit(object errorArgs) 
    { 
     Start(); 
    } 
} 
class Worker 
{ 
    public AbnormalExitDelegate AbnormalExitCallback; 
    public void DoWork() 
    { 
     try 
     { 
      // do work here 
     } 
     catch (Exception ex) 
     { 
      // pass stuff back, like the exception 
      AbnormalExitCallback(ex); 
     } 
    } 
} 
Questions connexes