2010-03-04 10 views
5

Tengo un hilo de trabajo que es vital para mi aplicación.
Se creó con new Thread(method).Start(); No me uno, solo espero que se ejecute mientras mi programa se ejecute.
Sin embargo, puede suceder que haya una excepción atrapada en este hilo; y como consecuencia, el hilo se cerrará (junto con el último registro). Una recuperación no es posible para este error crítico. Como el hilo es vital para la aplicación, también debe apagarse.Cómo supervisar un hilo de trabajo vital

Ahora mi pregunta es: ¿Cómo puedo controlar el estado de mi hilo?

¿Le

  • encuesta IsAlive la propiedad?
  • ¿volver a lanzar la excepción atrapada y trabajar con AppDomain.CurrentDomain.UnhandledException?
  • ¿Implementar un event que señalará el final de mi hilo de fondo?
  • utiliza un BackgroundWorker, que implementa RunWorkerCompleted? (¿Pero es un BackgroundWorker realmente la elección correcta para los hilos de larga ejecución?)
  • algo completamente diferente?

EDIT:
En este momento, resuelto el problema llamando Application.Exit() ->accidente temprano y con frecuencia. Esa es una opción, también :)

Respuesta

2

¿Por qué no envolver su rutina principal hilo de la siguiente manera:

void ThreadStart() 
{ 
     try 
     { 
      ThreadImplementation();   
     } 
     catch (Exception e) 
     { 
      mainForm.BeginInvoke(OnBackgroundThreadException, e); 
     } 
} 

Esto se asegurará de que aparezca un mensaje en el hilo principal de la aplicación cada vez que el hilo hace un anormal apagar. No necesitas sondear nada. Un BackgroundWorker suele ser útil cuando necesita volver a hablar con el subproceso de interfaz de usuario de forma asincrónica. (I.E. actualizaciones de progreso).

+0

Pero necesito una referencia a un control - sólo para este purpuse:/ – tanascius

+0

Un control es una forma conveniente de ejecutar código en el hilo de UI. No necesariamente el único camino. Por lo general, debe volver atrás en algún momento, tiendo a preferir lo antes posible. –

2

Al final del gestor de excepciones de su hilo, invocar un método de devolución de llamada en el hilo principal y reiniciar el trabajador:

public delegate void AbnormalExitDelegate(object errorArgs); 

class Boss 
{ 
    Worker worker; 
    void Start() 
    { 
     worker = new Worker(); 
     worker.AbnormalExitCallback = new AbnormalExitDelegate(AbnormalExit); 
     Thread workerThread = new Thread(worker.DoWork); 
     workerThread.Start(); 
    } 
    public void AbnormalExit(object errorArgs) 
    { 
     Start(); 
    } 
} 
class Worker 
{ 
    public AbnormalExitDelegate AbnormalExitCallback; 
    public void DoWork() 
    { 
     try 
     { 
      // do work here 
     } 
     catch (Exception ex) 
     { 
      // pass stuff back, like the exception 
      AbnormalExitCallback(ex); 
     } 
    } 
} 
Cuestiones relacionadas