2008-08-09 19 views
8

que tienen algo de código para iniciar un hilo en el .NET CF 2.0:¿Cómo esperar a que se complete el hilo antes de continuar?

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

Si llamo a esto dentro de un bucle de los artículos completos fuera de orden. ¿Cómo se introduce una espera después de t.Start(), para que el trabajo en el hilo finalice antes de que el código continúe? ¿BeginInvoke/EndInvoke será una mejor opción para esto que la creación manual de subprocesos?

Respuesta

9

¿Cuánto fin Qué se necesita para imponer a los hilos? Si solo necesita que todo el trabajo iniciado en el ciclo finalice antes de que el código continúe, pero no le importa el orden en que finaliza el trabajo dentro del bucle, la respuesta es llamar a Unirse. Para agregar más detalles al Kevin Kenny's answer,, debe llamar al fuera del el bucle. Esto significa que usted tendrá una colección para contener referencias a los hilos de comenzar:

// 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 se llama Únete dentro del bucle, el resultado sería básicamente la misma que no usar hilos en absoluto. Cada iteración del cuerpo del bucle crearía e iniciaría un hilo, pero luego se uniría inmediatamente y esperaría a que terminara.

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

2

Si leo esto correctamente, está comenzando a trabajar elementos en un montón de hilos, pero le preocupa que los hilos estén terminando fuera de orden, y, preferiría esperar hasta que cada hilo termine en el orden en que fueron comenzados?

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

Si hacía falta esperar a que un hilo para completar la que sólo se podía hacer:

t.Join(); 
4

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