2010-05-05 22 views
28

Ich habe folgendes Problem:Wie zu überprüfen, ob Thread-Ausführung abgeschlossen

ich will (C#) überprüfen, ob ein Thread der Ausführung beendet hat, das heißt, wenn die Thread-Methode zurückgegeben wird. Was ich jetzt mache ist Thread.Join(1) anrufen, aber das gibt eine Verzögerung von 1 ms. Gibt es eine Möglichkeit, einfach zu überprüfen, ob ein Thread fertig ist. Die Inspektion Thread.ThreadState scheint einfach zu umständlich.

Antwort

7

Sie können ein Ereignis aus Ihrem Thread auslösen, wenn es abgeschlossen ist, und dieses abonnieren.

Alternativ können Sie Thread.Join() ohne Argumente aufrufen:

Blockiert den aufrufenden Thread, bis ein Thread beendet wird, während sie weiterhin Standard-COM und Sendmessage Pumpen durchzuführen.

Thread.Join(1) wird:

Blockiert den aufrufenden Thread, bis ein Thread beendet wird oder die vorgegebene Zeit abgelaufen ist, während sie weiterhin Standard COM und Sendmessage Pumpen durchzuführen.

In diesem Fall beträgt die angegebene Zeit 1 Millisekunde.

+4

Vor dem Aufruf Thread.Join(), um die Callback-Methode aufrufen, sollten Sie immer überprüfen, ob Der aktuelle Thread ist anders als der, dem Sie beitreten. Sonst wirst du nie zurückkehren. –

+0

@Daniel - guter Punkt. – ChrisF

+0

@DanielRose Können Sie einen kurzen Ausschnitt darüber geben, wie Sie prüfen können, ob sie unterschiedlich sind? Vielen Dank. –

8

Für einen Thread haben Sie die myThread.IsAlive Eigenschaft. Es ist falsch, wenn die Thread-Methode zurückgegeben oder der Thread abgebrochen wurde.

0

Es hängt davon ab, wie Sie es verwenden möchten. Die Verwendung eines Join ist eine Möglichkeit. Eine andere Möglichkeit, dies zu tun, ist, dass der Thread den Aufrufer des Threads mithilfe eines Ereignisses benachrichtigt. Wenn Sie zum Beispiel über einen Thread für die grafische Benutzeroberfläche (GUI) verfügen, der einen Prozess aufruft, der eine Weile ausgeführt wird und nach Abschluss des Vorgangs die GUI aktualisieren muss, können Sie das Ereignis dazu verwenden. Diese Webseite gibt Ihnen eine Vorstellung darüber, wie mit Ereignissen arbeiten:

http://msdn.microsoft.com/en-us/library/aa645739%28VS.71%29.aspx

Denken Sie daran, dass es im Quer-Threading-Operationen und für den Fall, führen Sie die GUI von einem anderen Thread aktualisieren möchten, müssen Sie verwenden die Invoke Methode der Kontrolle, die Sie aktualisieren möchten.

7

Warum nicht anrufen Thread.Join(TimeSpan.Zero)? Es blockiert den Aufrufer nicht und gibt einen Wert zurück, der angibt, ob der Thread seine Arbeit abgeschlossen hat. Übrigens, das ist die Standardmethode, um alle WaitHandle Klassen zu testen.

1

Ich benutze IsAlive ausführlich, es sei denn, ich (des aufrufenden Threads) die aktuelle Ausführung blockiert werden soll, wobei in diesem Fall I() ohne Parameter Join einfach anrufen. Beachten Sie, dass IsAlive möglicherweise false zurückgibt, wenn der Zielthread aus irgendeinem Grund noch nicht gestartet wurde.

Carlos Merighe.

1

Werfen Sie einen Blick auf BackgroundWorker Class, mit der OnRunWorkerCompleted können Sie es tun.

+5

Link-Only-Antworten sind schlechte Antworten, denn wenn sich der Link ändert, wird Ihre Antwort nutzlos. Bitte fügen Sie die relevanten Informationen in die Antwort ein und erklären Sie, warum das, was Sie vorschlagen, die Frage beantwortet. – ChrisF

1

Wenn Sie den aktuellen Thread nicht blockieren möchten, indem Sie auf die Beendigung des anderen laufenden Threads warten/prüfen, können Sie die Rückrufmethode wie folgt implementieren: .

Action onCompleted =() => 
{ 
    //On complete action 
}; 

var thread = new Thread(
() => 
    { 
    try 
    { 
     // Do your work 
    } 
    finally 
    { 
     onCompleted(); 
    } 
    }); 
thread.Start(); 

Wenn Sie mit den Kontrollen handelt, die nicht verkanten Betrieb nicht unterstützt, dann müssen Sie

this.invoke(onCompleted); 
+0

das ist genial. Danke. – Yohannes

+0

Können Sie die ID an den onCompleted() Callback übergeben? – Mike

Verwandte Themen