2016-08-29 1 views
2

Ich habe einen Haupt-Thread t1 genannt:Überprüfen Sie, ob ein Thread rekursiv ausgeführt wird?

Thread t1 => new Thread(UpdateResults); 

, das ein Verfahren ausführen UpdateResult diese Methode erfordert Internetverbindung genannt. Jetzt könnte die Verbindung manchmal unterbrochen werden. Wenn die Verbindung unterbrochen ist, gibt die Methode eine Ausnahme zurück und der Thread t1 beendet die Ausführung.

Ich brauche den Faden wieder auszuführen t1 so, obwohl ich t2 einen anderen Thread zu erstellen, die rekursiv prüfen, ob der Faden t1 ist oder nicht ausgeführt wird.

Beide Gewinde werden automatisch gestartet. Dies ist der Code des Gewindes t2 Methode:

while (true) 
{ 
    if (!t1.IsAlive) 
    { 
     t1.Start(); 
    } 
} 

dieser Code unfortuntely die App UI verlangsamen, weil es eine unendliche Schleife. Was kann ich stattdessen tun, um das zu beheben?

+0

Wrap 'UpdateResults' in einem' try..catch' Block? – BlackBear

+0

@BlackBear ist bereits in einem Versuch Catch-Block, aber der Thread beendet die Ausführung, wenn eine Ausnahme ist – AgainMe

+0

Ich würde sagen, "updateresults" haben die erneute versuchen/verbinden, nicht der Thread. Der Thread sollte nur dort sein, wo die Arbeit gemacht wird, nicht ein Tester, um zu wissen, ob es getan wurde, denke ich. –

Antwort

2

Statt einen anderen Thread zu verschwenden t2 nur t1 zu sehen, können Sie prüfen, die Methode des Thread zu ändern t1: (! ohne es Erneutes Auslösen von)

Thread t1 = new Thread(o => 
{ 
    while (true) 
    { 
     try 
     { 
      UpdateResult(); 
     } 
     catch (Exception) 
     { 
      // do some error handling 
     } 
     Thread.Sleep(100); 
    } 
}); 

So fangen Sie die Ausnahme und verhindern den Absturz von dem ganzen Thread.

Dies ist natürlich nur ein einfaches Beispiel. Sie sollten versuchen, nur die spezifische Ausnahme für eine unterbrochene Verbindung abzufangen und eine ordnungsgemäße Fehlerbehandlung (z. B. Protokollierung usw.) hinzuzufügen.
Und passen Sie die Zeit an, die der Thread nach Ihren Bedürfnissen schlafen sollte.

+0

Ich mag diese Lösung wirklich, scheint im Code gut zu funktionieren. Danke an alle;) – AgainMe

2

Ein Ansatz eine unendliche Abfrage zu vermeiden, ist Join der Faden, und wieder laichen es, wenn es aufhört:

while (true) { 
    t1.Join(); 
    t1 = ... // Make a replacement thread 
    t1.Start(); 
} 

Es versteht sich, dass dies nicht von UI-Thread getan werden sollte, weil Join() Blöcke unbegrenzt.

1

Wenn Sie bei Ihrer Architektur bleiben möchten, würde etwas so einfaches wie das Warten auf eine Sekunde in jeder Schleife von Thread t2 die Leistung massiv verbessern.

while (true) 
{ 
    if(!t1.isAlive) 
    { 
     t1.Start(); 
    } 
    Thread.Sleep(1000); 
} 

(Sie können die Zeit auf etwas einstellen, den Sinn in Ihrem Kontext macht.)

Obwohl anstelle dieser Multi-Thread-Lösung, ich würde fragen: warum t1 Thread aufgrund einer Ausnahme beendet? Sie können es mit einem try - catch Block fangen.

Statt UpdateResults Aufruf SafeUpdateResults, die nur sagt:

void SafeUpdateResults() 
{ 
    while (true) 
    { 
     try { UpdateResults(); } 
     catch (Exception e) 
     { 
      //track the Error if you want 
      Console.WriteLine("t1-Error: " + e.Message); 
     } 
    } 
} 

Ich würde sogar empfehlen, in die Funktion gehen UpdateResults() und die Exception fangen genau da, wo es passiert, und dann entsprechend reagieren (wenn auch hier das wohl leichter).

+1

leider wurde meine bescheidene Suche nach Reputation noch einmal durch schnellere Plakate vereitelt. – TheHowlingHoaschd

+0

Danke trotzdem für deine Zeit. – AgainMe

+0

Dank ^^ und einige Redundanz tut nie weh. – TheHowlingHoaschd

Verwandte Themen