2010-07-22 10 views
6
public void threadMethod() 
{ 
    try 
    { 
     // do something 
    }  
    catch (ThreadInterruptedException e) 
    { 
     Console.WriteLine("[Net]", role, "Thread interrupted."); 
     n.CloseConnection(); 
    } 
    finally 
    { 
     if (isAutenticated == false) 
     { 
      n.CloseConnection(); 
     } 

     Dispatcher.Invoke(addMessage, "Network connection searching was disabled."); 
     DebuggerIX.WriteLine("[Net]", role, "Finished"); 
     Dispatcher.Invoke(threadStoppedDel); 
    } 
} 

El método threadMethod se ejecuta a través de System.Threading.Thread. El hilo puede ser interrumpido siempre que la excepción ThreadInterruptedException pueda ser arrojada al bloque finally, ¿verdad? ¿Tengo que encerrar el bloque por fin en try-catch nuevamente?¿Cómo manejar adecuadamente ThreadInterruptedException?

Gracias!

+0

La mejor manera de manejarlo es no causarlo. No use excepciones para cambiar el control de flujo de sus hilos. Use señales de hilo cruzado bien establecidas, como 'ManualResetEvent'. –

Respuesta

7

Se produce una excepción de subproceso interrumpido cuando el hilo se interrumpe llamando manualmente al Thread.Interrupt. Windows mismo no interrumpirá su hilo usando ese método. En general, será su programa el que controlará cuándo se envía un hilo a la señal de interrupción (no todo el tiempo). Como la señal de interrupción se puede usar para controlar el flujo, por lo general no se envía dos veces en una sucesión rápida.

ThreadInterruptedException se lanza en el hilo interrumpido, pero no hasta que el hilo se bloquea. Si el hilo nunca se bloquea, la excepción nunca se lanza, y así el hilo puede completarse sin interrupción.

Si su hilo nunca duerme o espera en otros objetos (ingresando en un estado WaitSleepJoin) nunca verá la excepción lanzada.

Proteger su hilo como lo tiene debe ser aceptable. No olvide que también se puede lanzar una ThreadAbortException, que es ligeramente más penetrante y se puede lanzar con más frecuencia (la aplicación se está cerrando, etc.).

+0

Hablando de 'ThreadAbortException', ¿no quedaría el' deadlock 'Dispatcher.Invoke' en un escenario de descarga de dominio de aplicación? –

Cuestiones relacionadas