¿Cuál es el significado del método Thread.Join en C#?¿Cuál es el significado del método Thread.Join en C#?
MSDN dice que bloquea el hilo que llama hasta que termina un hilo. ¿Alguien puede explicar esto con un simple ejemplo?
¿Cuál es el significado del método Thread.Join en C#?¿Cuál es el significado del método Thread.Join en C#?
MSDN dice que bloquea el hilo que llama hasta que termina un hilo. ¿Alguien puede explicar esto con un simple ejemplo?
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.
}
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.
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.
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
.
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
@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. –
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
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);
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.
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
en realidad, eso no es correcto. si quieres que 'Thread1' espere hasta que 'Thread2' termine, ejecutas' Thread2.Join() ', no' Thread1.Join() '. – d7samurai