Frage

Von Zeit zu Zeit bekomme ich eine System.Threading.ThreadStateException beim Versuch neu zu starten, einen thread.Der code in der Frage ist wie folgt:

// Make sure the thread is done stopping
while (this.mThread.ThreadState == ThreadState.Running)
{ 
    Thread.Sleep(0);
}
// Respawn a thread if the current one is stopped or doesn't exist
if (this.mThread == null || this.mThread.ThreadState == ThreadState.Stopped)
{ 
    this.mThread = new Thread(new ParameterizedThreadStart(Monitor)); }
// Start the thread
if (check)
{ 
    this.mThread.Start(60000); 
}
else
{   
    this.mThread.Start(0); 
}

Also zwei Fragen - ist das der richtige Weg, Dinge zu tun, und es ist, gibt es eine Möglichkeit, den Fehler zu vermeiden?

War es hilfreich?

Lösung

Das problem ist, dass Sie code haben, der zuerst überprüft wird, ob Sie es schaffen sollte ein neues thread-Objekt, und ein anderes Stück code, der bestimmt, ob zum starten des thread-Objekts.Durch race-conditions und ähnliche Sachen, Ihr code könnte versuchen, am Ende zu nennen .Starten Sie auf einem vorhandenen thread-Objekt.Da Sie nicht nach den details, die hinter der check variable, es ist unmöglich zu wissen, was auslösen könnte dieses Verhalten.

Sollten Sie reorganisieren Sie Ihren code so, dass .Starten Sie garantiert nur aufgerufen werden, die auf neue Objekte.Kurz gesagt, Sie sollte legen Sie die Start-Methode in die gleiche if-Anweisung wie der, der erzeugt ein neues thread-Objekt.

Persönlich würde ich versuchen zu reorganisieren der gesamte code, so dass ich nicht brauchen, um erstellen Sie einen anderen thread, aber wickeln Sie den code in das thread-Objekt in einer Schleife, so dass der Faden hält-geht.

Andere Tipps

Es ist möglich, dass ein thread, der in mehr als einem Staat auf einmal daher die ThreadState Eigenschaft ist eigentlich eine bitmap der möglichen Zustände.Also Tests auf Gleichheit mit nur einem Staat nicht geben Sie die richtige Ergebnis.Sie würde die Notwendigkeit, etwas zu tun wie:

if((mThread.ThreadState & ThreadState.Running) != 0)

Jedoch, die überprüfung thread-Zustand falsch ist, etwas zu tun.Ich bin mir nicht ganz klar, was Sie zu erreichen versuchen, aber ich denke, dass Sie darauf warten, einen thread zu beenden, bevor ihn neu zu starten.In diesem Fall sollten Sie tun:

mThread.Join();
mThread = new Thread(new ParameterizedThreadStart(Monitor));
if(check)
    mThread.Start(60000);
else
    mThread.Start(0);

Obwohl, wenn Sie beschreiben das problem, das Sie versuchen zu lösen in mehr detail ich bin fast sicher, es wird eine bessere Lösung sein.Das warten auf einen thread zu beenden, nur um es neu zu starten wieder scheint nicht effizient zu mir.Vielleicht brauchen Sie nur eine Art der inter-thread-Kommunikation?

John.

Ein ThreadStateException ausgelöst, weil Sie versuchen, starten Sie einen thread in einer nicht startbar Zustand.Die wahrscheinlichsten Situationen wäre, dass es bereits ausgeführt wird, oder dass Sie vollständig verlassen.

Es gibt möglicherweise ein paar Dinge, die geschehen könnten.Ersten ist, der thread möglicherweise übergang vom Laufen zum StopRequested, die nicht vollständig gestoppt, aber, so Ihre Logik nicht einen neuen thread erstellen, und Sie sind versucht, eine Diskussion starten, die gerade ausgeführt oder ist über fertig ausgeführt (von denen keines ist eine gültige Staat für einen Neustart).

Die andere Möglichkeit ist, dass der thread wurde abgebrochen.Threads, die abgebrochen gehen Sie zu dem gescheiterten Staat, nicht den Status "Beendet" werden, und natürlich gelten auch dann nicht für einen Neustart.

Wirklich, die einzige Art von thread, der ist noch am Leben, die kann ein "Neustart" ist eine, die ausgesetzt worden ist.Sie möchten möglicherweise verwenden Sie diese bedingten statt:

if (this.mThread == null || this.mThread.ThreadState != ThreadState.Suspended)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top