2010-03-19 13 views

Antwort

14

Join() ist im Grunde while(thread.running){}

{ 
    thread.start() 
    stuff you want to do while the other thread is busy doing its own thing concurrently 
    thread.join() 
    you won't get here until thread has terminated. 
} 
3

Angenommen, Sie haben einen Hauptthread, der Arbeit an Worker-Threads delegiert. Der Hauptthread benötigt einige Ergebnisse, die die Worker berechnen, sodass er nicht fortgesetzt werden kann, bis alle Worker-Threads beendet sind.

In diesem Szenario würde der Hauptthread Join() auf jedem der Worker-Threads aufrufen. Nachdem alle Aufrufe Join() zurückgegeben wurden, weiß der Haupt-Thread, dass alle Worker-Threads beendet sind und dass die berechneten Ergebnisse für seinen Verbrauch verfügbar sind.

3

Stellen Sie sich vor, Ihr Programm läuft in Thread1. Dann müssen Sie eine Berechnung oder Verarbeitung starten - Sie starten einen anderen Thread - Thread2. Wenn Sie möchten, dass Ihr Thread1 wartet, bis Thread2 endet, führen Sie Thread1.Join(); aus, und Thread1 wird nicht weiter ausgeführt, bis Thread2 beendet ist.

Hier ist die Beschreibung in MSDN.

+0

MSDN sagt dort, dass "blockiert den aufrufenden Thread, bis ein Thread beendet wird, während weiterhin Standard-COM-und SendMessage pumpen.". Was bedeutet das Ausführen von Standard-COM? Was bedeutet sendMessage? – Techee

+2

eigentlich, das ist nicht korrekt. Wenn Sie wollen, dass 'Thread1' wartet, bis' Thread2' endet, führen Sie 'Thread2.Join()', nicht 'Thread1.Join()' aus. – d7samurai

3

Das einfache Beispiel Ansatz:

public static void Main(string[] args) 
{ 
    Console.WriteLine("Main thread started."); 

    var t = new Thread(() => Thread.Sleep(2000)); 

    t.Start(); 

    t.Join(); 

    Console.WriteLine("Thread t finished."); 
} 

Das Programm beginnt durch Drucken einer Meldung auf dem Bildschirm, und dann einen neuen Thread beginnen, die gerade für 2 Sekunden pausiert, bevor beendet wird. Die letzte Nachricht wird erst gedruckt, nachdem der Thread t die Ausführung beendet hat, da der Methodenaufruf Join den aktuellen Thread blockiert, bis der Thread t beendet wird.

+0

Es ist einfach, aber auch ziemlich nutzlos: Ein Thread.Start sofort gefolgt von einem Thread.Join besiegt den ganzen Zweck der Verwendung eines zweiten Threads. (Ich weiß, es ist ein Spielzeug-Beispiel, aber immer noch ...) – Heinzi

+1

@Heinzi, es zeigt lediglich das zugrunde liegende Verhalten der 'Join'-Methode wie angefordert. Es war nie beabsichtigt, ein realistisches Szenario darzustellen. –

1
static void Main() 
{ 
Thread t = new Thread(new ThreadStart(some delegate here)); 
t.Start(); 
Console.WriteLine("foo"); 
t.Join() 
Console.WriteLine("foo2"); 
} 

In Ihrem delegieren Sie einen weiteren Anruf wie diese haben würde:

Console.WriteLine("foo3"); 

Ausgang ist:

foo 
foo3 
foo2 
8
int fibsum = 1; 

Thread t = new Thread(o => 
          { 
           for (int i = 1; i < 20; i++) 
           { 
            fibsum += fibsum; 
           } 
          }); 

t.Start(); 
t.Join(); // if you comment this line, the WriteLine will execute 
      // before the thread finishes and the result will be wrong 
Console.WriteLine(fibsum); 
0

Dies ist nur zu den vorhandenen Antworten hinzuzufügen, die erklären, was Join tut.

Der Aufruf Join hat auch den Nebeneffekt, dass die Nachrichtenpumpe Nachrichten verarbeiten kann. Sehen Sie diese knowledge base article für Situationen, in denen dies relevant sein kann.