2010-03-19 20 views

Respuesta

14

Join() es básicamente while(thread.running){}

{ 
    thread.start() 
    stuff you want to do while the other thread is busy doing its own thing concurrently 
    thread.join() 
    you won't get here until thread has terminated. 
} 
3

Supongamos que tiene un hilo principal que delega algo de trabajo a los hilos del trabajador. El hilo principal necesita algunos resultados que los trabajadores están computando, por lo que no puede continuar hasta que todos los hilos de trabajo hayan terminado.

En este escenario, el hilo principal llamaría a Join() en cada uno de los subprocesos de trabajo. Después de que todas las llamadas Join() hayan regresado, el hilo principal sabe que todos los subprocesos de trabajo han finalizado y que los resultados calculados están disponibles para su consumo.

3

Imagine que su programa se ejecuta en Thread1. Luego debe comenzar un cálculo o procesamiento; inicia otro hilo: Thread2. Entonces, si desea que su Thread1 espere hasta que finalice Thread2, ejecute Thread1.Join(); y Thread1 no continuará su ejecución hasta que Thread2 finalice.

Aquí está la descripción en MSDN.

+0

MSDN dice que "Bloquea el hilo de llamada hasta que finaliza un hilo, mientras continúa realizando el bombeo de COM y SendMessage estándar". ¿Cuál es el significado de realizar COM estándar? ¿Cuál es el significado de sendMessage bombeo? – Techee

+2

en realidad, eso no es correcto. si quieres que 'Thread1' espere hasta que 'Thread2' termine, ejecutas' Thread2.Join() ', no' Thread1.Join() '. – d7samurai

3

El enfoque simple ejemplo:

public static void Main(string[] args) 
{ 
    Console.WriteLine("Main thread started."); 

    var t = new Thread(() => Thread.Sleep(2000)); 

    t.Start(); 

    t.Join(); 

    Console.WriteLine("Thread t finished."); 
} 

El programa se inicia mediante la impresión de un mensaje a la pantalla y luego iniciar un nuevo hilo que apenas hace una pausa de 2 segundos antes de terminar. El último mensaje solo se imprime después de que el subproceso t finaliza la ejecución porque la llamada al método Join bloquea el subproceso actual hasta que finaliza el subproceso t.

+0

Es simple, pero también bastante inútil: un subproceso. Inicia inmediatamente seguido de un subproceso. Unir derrota todo el propósito de usar un segundo subproceso. (Sé que es un ejemplo de juguete, pero aún así ...) – Heinzi

+1

@Heinzi, simplemente demuestra el comportamiento subyacente del método 'Join 'según lo solicitado. Nunca fue la intención de representar un escenario del mundo real. –

1
static void Main() 
{ 
Thread t = new Thread(new ThreadStart(some delegate here)); 
t.Start(); 
Console.WriteLine("foo"); 
t.Join() 
Console.WriteLine("foo2"); 
} 

En su delegado que tendría otra llamada así:

Console.WriteLine("foo3"); 

salida es:

foo 
foo3 
foo2 
8
int fibsum = 1; 

Thread t = new Thread(o => 
          { 
           for (int i = 1; i < 20; i++) 
           { 
            fibsum += fibsum; 
           } 
          }); 

t.Start(); 
t.Join(); // if you comment this line, the WriteLine will execute 
      // before the thread finishes and the result will be wrong 
Console.WriteLine(fibsum); 
0

Esto es solo para agregar a las respuestas existentes, que explican qué hace Join.

Llamar a Join también tiene el efecto secundario de permitir que la bomba de mensajes maneje los mensajes. Consulte esto knowledge base article para situaciones donde esto pueda ser relevante.

Cuestiones relacionadas