¿Cómo esperar a que se complete el hilo antes de continuar?

¿Cómo esperar a que se complete el hilo antes de continuar?

¿Cuánto orden necesitas imponer en los hilos? Si solo necesita que todo el trabajo iniciado en el ciclo termine antes de que continúe el código, pero no le importa el orden en que finaliza el trabajo dentro del ciclo, llamar a Join es la respuesta. Para agregar más detalles a la respuesta de Kevin Kenny, debe llamar a Join outside el lazo. Esto significa que necesitará una colección para contener referencias a los hilos que inició:

// 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();
}

Por el contrario, si llamara a Join dentro del ciclo, el resultado sería básicamente el mismo que no usar hilos en absoluto. Cada iteración del cuerpo del ciclo crearía e iniciaría un hilo, pero luego se uniría inmediatamente y esperaría a que termine.

Si los subprocesos individuales producen algún resultado (por ejemplo, escribir un mensaje en un registro), es posible que los mensajes sigan apareciendo desordenados porque no hay coordinación entre los subprocesos. Es posible hacer que los subprocesos generen sus resultados en orden coordinándolos con un Monitor.


Si estoy leyendo esto correctamente, está iniciando elementos de trabajo en un montón de subprocesos, pero le preocupa que los subprocesos se completen fuera de orden y, ¿preferiría esperar hasta que cada subproceso se complete en el orden en que se iniciaron?

Si este es el caso, no estoy seguro de por qué está creando un hilo por elemento de trabajo. ¿Tal vez podrías expandirte?

Si necesita esperar a que se complete un hilo, puede hacer lo siguiente:

t.Join();

Otra forma de esperar a que termine un hilo es usar un 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();
}