2010-05-05 17 views
28

He siguiente problema:¿Cómo comprobar si la ejecución del hilo terminado

Quiero comprobar (C#) si un mensaje ha terminado la ejecución, es decir, si ha vuelto el método de hilo. Lo que hago ahora es llamar al Thread.Join(1), pero esto da un retraso de 1 ms. ¿Hay alguna manera de simplemente verificar si un hilo ha terminado? Inspeccionar Thread.ThreadState simplemente parece demasiado engorroso.

Respuesta

7

Puede disparar un evento de su hilo cuando termina y suscribirse a eso.

alternativa, se puede llamar Thread.Join() sin argumentos:

Bloques del subproceso de llamada hasta que un subproceso termina, sin dejar de realizar COM estándar y bombeo SendMessage.

Thread.Join(1) hará lo siguiente:

Bloques del subproceso de llamada hasta que un subproceso termina o transcurra el tiempo especificado, sin dejar de realizar COM estándar y bombeo SendMessage.

En este caso, el tiempo especificado es 1 milisegundo.

+4

Antes de llamar Thread.Join(), siempre se debe comprobar que el hilo actual es diferente al que se está uniendo. De lo contrario, nunca volverás. –

+0

@Daniel - buen punto. – ChrisF

+0

@DanielRose ¿Puedes dar un breve fragmento sobre cómo verificar si son diferentes? Gracias. –

8

Para un hilo tienes la propiedad myThread.IsAlive. Es falso si el método de hilo devuelto o el hilo fue abortado.

0

Depende de cómo quiera usarlo. Usar una unión es una forma. Otra forma de hacerlo es dejar que el hilo notifique a la persona que llama del hilo mediante un evento. Por ejemplo, cuando tienes el hilo de la interfaz gráfica de usuario (GUI) que llama a un proceso que se ejecuta por un tiempo y necesita actualizar la GUI cuando termina, puedes usar el evento para hacerlo. Este sitio web le da una idea acerca de cómo trabajar con eventos:

http://msdn.microsoft.com/en-us/library/aa645739%28VS.71%29.aspx

Recuerde que dará lugar a operaciones cruzadas roscado y en caso de que desee actualizar la interfaz gráfica de usuario desde otro hilo, que tendrá que utilizar el método Invoke del control que desea actualizar.

7

¿Por qué no llamar al Thread.Join(TimeSpan.Zero)? No bloqueará a la persona que llama y devolverá un valor que indica si el hilo ha completado su trabajo. Por cierto, esa es la forma estándar de probar todas las clases WaitHandle también.

1

Utilizo IsAlive extensamente, a menos que quiera bloquear la ejecución actual (del hilo de llamada), en cuyo caso solo llamo a Join() sin un parámetro. Ahora, tenga en cuenta que IsAlive puede devolver falso si el hilo de destino no ha comenzado la ejecución todavía por alguna razón.

Carlos Merighe.

1

Eche un vistazo a BackgroundWorker Class, con el OnRunWorkerCompleted puede hacerlo.

+5

Las respuestas de solo enlace son malas respuestas porque si el enlace alguna vez cambia su respuesta se vuelve inútil. Incorpore la información relevante en la respuesta y explique por qué lo que está sugiriendo responde la pregunta. – ChrisF

1

Si no desea bloquear el hilo actual esperando/verificando la finalización del otro hilo en ejecución, puede implementar un método de devolución de llamada como este.

Action onCompleted =() => 
{ 
    //On complete action 
}; 

var thread = new Thread(
() => 
    { 
    try 
    { 
     // Do your work 
    } 
    finally 
    { 
     onCompleted(); 
    } 
    }); 
thread.Start(); 

Si se trata de controles que no soporta la operación entre subprocesos, entonces usted tiene que invocar el método de devolución de llamada

this.invoke(onCompleted); 
+0

esto es increíble. gracias. – Yohannes

+0

¿Puedes pasar la identificación de nuevo a la devolución de llamada onCompleted()? – Mike

Cuestiones relacionadas