Wie kann man auf den Thread warten, bevor er fortfährt?

8

Ich habe Code zum Starten eines Threads auf dem .NET CF 2.0:

%Vor%

Wenn ich dies innerhalb einer Schleife anrufe, werden die Elemente nicht in der richtigen Reihenfolge ausgeführt. Wie führt man nach t.Start() eine Wartezeit ein, damit die Arbeit am Thread abgeschlossen wird, bevor der Code fortgesetzt wird? Ist BeginInvoke / EndInvoke eine bessere Option als das manuelle Erstellen von Threads?

    
Brian Lyttle 09.08.2008, 20:00
quelle

3 Antworten

9

Wie viel Ordnung müssen Sie den Threads auferlegen? Wenn Sie nur die gesamte in der Schleife gestartete Arbeit beenden müssen, bevor der Code fortgesetzt wird, aber die Reihenfolge, in der die Arbeit innerhalb der Schleife beendet wird, ist Ihnen egal, dann ist der Aufruf von Join die Antwort. Um weitere Details zu Kevin Kennys Antwort sollten Sie Join außerhalb die Schleife aufrufen. Das bedeutet, dass Sie eine Sammlung benötigen, die Verweise auf die von Ihnen gestarteten Threads enthält:

%Vor%

Im Gegensatz dazu, wenn Sie Join innerhalb der Schleife aufgerufen haben, wäre das Ergebnis im Prinzip das gleiche wie überhaupt keine Threads zu verwenden. Jede Iteration des Schleifenkörpers würde einen Thread erstellen und starten, aber dann sofort mitmachen und darauf warten, bis er fertig ist.

Wenn die einzelnen Threads ein Ergebnis produzieren (z. B. eine Nachricht in ein Protokoll schreiben), erscheinen die Nachrichten möglicherweise immer noch in der falschen Reihenfolge, da zwischen den Threads keine Koordination besteht. Es ist möglich, dass die Threads ihre Ergebnisse in der Reihenfolge ausgeben, indem sie sie mit einem Monitor koordinieren.

    
Dominic Cooney 10.08.2008, 08:37
quelle
4

Eine andere Methode, auf das Ende eines Threads zu warten, ist die Verwendung von AutoResetEvent .

%Vor%     
ollifant 20.08.2008 12:54
quelle
2

Wenn ich das richtig lese, starten Sie Arbeitselemente in einem Haufen von Threads, aber Sie befürchten, dass die Threads in der richtigen Reihenfolge ausgeführt werden, und würden lieber warten, bis jeder Thread in der Reihenfolge abgeschlossen ist, in der sie waren gestartet ?

Wenn dies der Fall ist, bin ich mir nicht sicher, warum Sie einen Thread pro Arbeitselement erstellen. Vielleicht könnten Sie erweitern?

Wenn Sie auf einen Thread warten müssen, um den Vorgang abzuschließen, können Sie einfach Folgendes tun:

%Vor%     
Kev 09.08.2008 22:32
quelle