2008-08-09 10 views
8

Ich habe einige Code für einen Thread auf .NET CF Ausgangs 2.0: aus der OrdnungWie warte ich auf den Faden, bevor ich fortfahre?

ThreadStart tStart = new ThreadStart(MyMethod); 
Thread t = new Thread(tStart); 
t.Start(); 

Wenn ich dies die Angaben in einer Schleife aufzurufen. Wie führt man eine Wartezeit nach t.Start() 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?

Antwort

9

Wie viel Ordnung brauchen Sie an den Fäden zu verhängen? Wenn Sie nur die gesamte in der Schleife gestartete Arbeit beenden müssen, bevor der Code fortgesetzt wird, die Reihenfolge, in der die Arbeit innerhalb der Schleife beendet wird, ist Ihnen jedoch egal, dann ist der Aufruf von Join die Antwort. Um weitere Details zu Kevin Kenny's answer, hinzuzufügen, sollten Sie die Verbindung außerhalb der Schleife aufrufen. Dies bedeutet, dass Sie eine Sammlung benötigen Verweise auf die Themen zu halten Sie den Start:

// Start all of the threads. 
List<Thread> startedThreads = new List<Thread>(); 
foreach (...) { 
    Thread thread = new Thread(new ThreadStart(MyMethod)); 
    thread.Start(); 
    startedThreads.Add(thread); 
} 

// Wait for all of the threads to finish. 
foreach (Thread thread in startedThreads) { 
    thread.Join(); 
} 

Im Gegensatz dazu, wenn Sie innerhalb der Schleife Join genannt, würde im Grunde das Ergebnis das gleiche sein wie keine Threads überhaupt verwendet wird. Jede Iteration des Schleifenkörpers würde einen Thread erstellen und starten, aber dann sofort mitmachen und darauf warten, dass er beendet wird.

Wenn die einzelnen Threads ein Ergebnis erzeugen (z. B. eine Nachricht in ein Protokoll schreiben), werden die Nachrichten möglicherweise immer noch in der falschen Reihenfolge angezeigt, 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.

2

Wenn ich das richtig lese, starten Sie Arbeitselemente auf einer Reihe von Threads, aber Sie sind besorgt, dass die Threads nicht ordnungsgemäß ausgeführt werden, und möchten lieber warten, bis jeder Thread in der Reihenfolge abgeschlossen ist wurden angefangen?

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

Wenn Sie haben für einen Thread warten müssen das Sie ausfüllen konnte einfach tun:

t.Join(); 
4

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

private readonly AutoResetEvent mWaitForThread = new AutoResetEvent(false); 

private void Blah() 
{ 
    ThreadStart tStart = new ThreadStart(MyMethod); 
    Thread t = new Thread(tStart); 
    t.Start(); 

    //... (any other things) 
    mWaitForThread.WaitOne(); 
} 

private void MyMethod() 
{ 
    //... (execute any other action) 
    mWaitForThread.Set(); 
}