it-swarm.com.de

So prüfen Sie, ob die Ausführung des Threads abgeschlossen ist

Ich habe folgendes Problem:

Ich möchte (C #) überprüfen, ob ein Thread die Ausführung abgeschlossen hat, d. H. Ob die Thread-Methode zurückgegeben wurde. Was ich jetzt mache, ist Thread.Join(1), aber dies gibt eine Verzögerung von 1 ms. Gibt es eine Möglichkeit, einfach zu überprüfen, ob ein Thread fertig ist. Die Überprüfung von Thread.ThreadState erscheint einfach zu umständlich. 

31
Bogi

Verwenden Sie das Flag Thread.IsAlive . Hiermit geben Sie den Thread-Status an.

55
Mohanavel

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

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

Blockiert den aufrufenden Thread, bis ein Thread beendet wird, während er weiterhin das standardmäßige COM- und SendMessage-Pumpen durchführt.

Thread.Join(1) wird:

Blockiert den aufrufenden Thread, bis ein Thread beendet wird oder die angegebene Zeit verstrichen ist, während das Standardpumpen mit COM und SendMessage fortgesetzt wird.

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

9
ChrisF

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

9
Daniel Rose

Use Thread.Join(TimeSpan.Zero) Es blockiert den Aufrufer nicht und gibt einen Wert zurück, der angibt, ob der Thread seine Arbeit beendet hat. Dies ist übrigens die Standardmethode zum Testen aller WaitHandle-Klassen.

7
Brian Gideon

Wenn Sie den aktuellen Thread nicht durch Warten/Prüfen auf den Abschluss des anderen laufenden Threads blockieren möchten, können Sie die Callback-Methode.

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

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

Wenn Sie Steuerelemente verwenden, die keine cross-thread-Operation unterstützen, müssen Sie die Callback-Methode aufrufen

this.invoke(onCompleted);
3
shanmuga raja

Werfen Sie einen Blick auf BackgroundWorker Class , mit dem RunWorkerCompleted können Sie es tun.

1
Korteby Farouk

Ich verwende IsAlive ausgiebig, es sei denn, ich möchte die aktuelle Ausführung (des aufrufenden Threads) blockieren. In diesem Fall rufe ich Join () ohne Parameter auf. Beachten Sie, dass IsAlive möglicherweise false zurückgibt, wenn der Ziel-Thread aus irgendeinem Grund noch nicht mit der Ausführung begonnen hat.

Carlos Merighe.

1

Es hängt davon ab, wie Sie es verwenden möchten. Die Verwendung eines Joins ist eine Möglichkeit. Eine andere Möglichkeit besteht darin, den Thread den Aufrufer mithilfe eines Ereignisses über den Thread benachrichtigen zu lassen. Wenn Sie beispielsweise über einen grafischen Benutzeroberflächen-Thread (GUI) verfügen, der einen Prozess aufruft, der eine Weile ausgeführt wird und nach dessen Abschluss die GUI aktualisiert werden muss, können Sie das Ereignis dazu verwenden. Diese Website gibt Ihnen eine Vorstellung davon, wie Sie mit Ereignissen arbeiten:

http://msdn.Microsoft.com/de-de/library/aa645739%28VS.71%29.aspx

Denken Sie daran, dass dies zu Cross-Threading-Operationen führt. Wenn Sie die GUI von einem anderen Thread aus aktualisieren möchten, müssen Sie die Invoke-Methode des Steuerelements verwenden, das Sie aktualisieren möchten.

0
intodev