Was ist die Bedeutung der Thread.Join Methode in C#?Was bedeutet die Thread.Join-Methode in C#?
MSDN sagt, dass es den aufrufenden Thread blockiert, bis ein Thread beendet wird. Kann jemand das mit einem einfachen Beispiel erklären?
Was ist die Bedeutung der Thread.Join Methode in C#?Was bedeutet die Thread.Join-Methode in C#?
MSDN sagt, dass es den aufrufenden Thread blockiert, bis ein Thread beendet wird. Kann jemand das mit einem einfachen Beispiel erklären?
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.
}
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.
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.
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.
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
@Heinzi, es zeigt lediglich das zugrunde liegende Verhalten der 'Join'-Methode wie angefordert. Es war nie beabsichtigt, ein realistisches Szenario darzustellen. –
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
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);
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.
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
eigentlich, das ist nicht korrekt. Wenn Sie wollen, dass 'Thread1' wartet, bis' Thread2' endet, führen Sie 'Thread2.Join()', nicht 'Thread1.Join()' aus. – d7samurai