Pregunta

Tengo un código para iniciar un hilo en .NET CF 2.0:

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

Si llamo a esto dentro de un bucle, los elementos están completamente desordenados.¿Cómo introducir una espera después? t.Start(), para que el trabajo en el hilo se complete antes de que el código continúe?¿BeginInvoke/EndInvoke será una mejor opción para esto que crear hilos manualmente?

¿Fue útil?

Solución

¿Cuánto orden necesitas imponer en los hilos?Si solo necesita que todo el trabajo iniciado en el bucle finalice antes de que el código continúe, pero no le importa el orden en que termina el trabajo dentro del bucle, entonces llamar a Join es la respuesta.Para agregar más detalles a La respuesta de Kevin Kenny, deberías llamar a unirse afuera el lazo.Esto significa que necesitarás una colección para contener referencias a los hilos que iniciaste:

// 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 llamaste a Join dentro del bucle, el resultado sería básicamente el mismo que no usar subprocesos en absoluto.Cada iteración del cuerpo del bucle crearía e iniciaría un hilo, pero luego inmediatamente lo uniría y esperaría a que terminara.

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

Otros consejos

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

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

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

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

t.Join();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top