2010-03-04 15 views
5

Ich habe einen Worker Thread, der für meine Anwendung unerlässlich ist.
Es ist mit new Thread(method).Start(); erstellt ich nicht beitreten, ich erwarte nur, dass läuft, solange mein Programm läuft.
Es kann jedoch vorkommen, dass in diesem Thread eine Ausnahme auftritt. und als Folge wird der Thread (neben einigen letzten Logging) heruntergefahren. Eine Wiederherstellung ist für diesen kritischen Fehler nicht möglich. Da der Thread für die App wichtig ist, muss er ebenfalls heruntergefahren werden.So überwachen Sie einen wichtigen Worker-Thread

Jetzt ist meine Frage: Wie kann ich den Zustand meines Threads überwachen?

Möchten Sie

  • Poll die IsAlive Eigenschaft?
  • die gefangene Ausnahme erneut auslösen und mit AppDomain.CurrentDomain.UnhandledException arbeiten?
  • implementieren Sie eine event, die das Ende meines Hintergrundthread signalisieren wird?
  • Verwenden Sie eine BackgroundWorker, die RunWorkerCompleted implementiert? (Aber ist ein BackgroundWorker wirklich die richtige Wahl für lange laufende Threads?)
  • etwas completley anders?

EDIT:
Gerade jetzt, ich löste das Problem, indem Application.Exit() Aufruf ->Absturz früh und häufig. Das ist eine Option, auch :)

Antwort

2

Warum Sie wickeln Sie nicht Ihre Haupt-Thread-Routine wie folgt aus:

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

Dies wird Ihnen eine Nachricht auf der Haupt-Thread der Anwendung erhalten stellen Sie sicher, wenn der Faden tut eine abnorme Herunterfahren. Sie müssen nichts abfragen. Ein BackgroundWorker ist normalerweise nützlich, wenn Sie asynchron über den UI-Thread sprechen müssen. (I.E. Fortschritts-Updates).

+0

Aber ich brauche einen Verweis auf eine Kontrolle - nur für diese purpuse:/ – tanascius

+0

Eine Kontrolle ist eine bequeme Möglichkeit, Code im UI-Thread auszuführen. Nicht unbedingt der einzige Weg. Normalerweise müssen Sie irgendwann zurückschalten, ich bevorzuge es so schnell wie möglich. –

2

Am Ende Ihrer Exception-Handler Thread, eine Callback-Methode auf Ihrem Haupt-Thread aufrufen und den Arbeiter neu starten:

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); 
     } 
    } 
} 
Verwandte Themen