Frage

Ich habe einige code, der für das starten eines Threads auf .NET CF 2.0:

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

Wenn ich rufe, das in einer Schleife die Elemente völlig in Ordnung.Wie kann einzuführen, warten Sie nach t.Start(), so dass die Arbeit auf der thread abgeschlossen ist, bevor Sie den code weiter?Wird BeginInvoke/EndInvoke eine bessere option sein als das manuelle erstellen von threads?

War es hilfreich?

Lösung

Wie viel Ordnung brauchst du, zu verhängen, um die Fäden?Wenn Sie müssen nur alle von der Arbeit begann in der Schleife zu beenden, bevor Sie den code weiter, aber Sie kümmern sich nicht über die Reihenfolge der Arbeit innerhalb der Schleife abgeschlossen ist, dann Aufruf von Join ist die Antwort.Weitere Details hinzufügen, um Kevin Kenny Antwort, sollten Sie rufen Beitreten außerhalb die Schleife.Dies bedeutet, Sie müssen eine Kollektion, die Verweise auf die Sie threads gestartet:

// 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 aufgerufen begleiten innerhalb der Schleife, das Ergebnis wäre grundsätzlich das gleiche wie nicht mit threads zu allen.Jede iteration der Schleife würde erstellen und starten Sie einen thread, aber dann sofort anschließen und warten für es zu finish.

Wenn die einzelnen Fäden produzieren einige führen (schreiben Sie eine Nachricht in ein Protokoll, für Beispiel), dann die Nachrichten möglicherweise immer noch außerhalb der Reihenfolge angezeigt, da keine Koordination zwischen den threads.Es ist auch möglich, die Fäden zur Ausgabe der Ergebnisse, damit koordinieren Sie mit einem Monitor.

Andere Tipps

Ein anderer Weg, zu warten, für einen thread zu beenden, 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();
}

Wenn ich Lesen das richtig, Sie sind ab Werk Elemente auf mehreren threads, aber Sie sind besorgt, dass die Gewinde abschließen, out of order, und würde lieber warten, bis jeder thread vollständig in der Reihenfolge wie Sie gestartet wurden ?

Wenn dies der Fall ist, dann bin ich mir nicht sicher, warum, Sie erstellen einen thread pro Workitem.Vielleicht könnte man erweitern?

Wenn Sie nicht brauchen, zu warten, bis ein thread zu vervollständigen, konnte man nur tun:

t.Join();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top