2009-02-08 12 views
11

Come posso rilevare che la mia applicazione .NET si è arrestata in modo anomalo e quindi riavviarla?Rilevamento e riavvio dell'applicazione .NET bloccata

+0

Ho trovato alcune soluzioni a questa domanda (prima che le chiedessi), quindi ho pensato che sarebbe stato bello avere le risposte in SO. Se hai altre risposte, si prega di essere mio ospite. Oppure vota la migliore risposta per guidare gli altri. Inoltre, per favore riadatta questa domanda come ritieni appropriato. –

+0

Aggiunte informazioni sul riavvio di un'app console, poiché apparentemente è ciò che si sta utilizzando. – RoadWarrior

risposta

14

Un'altra soluzione (basata su this example) è di creare un lanciatore che controlla l'applicazione:

class LauncherProgram 
{ 
    static int count = 3; 

    static void Main() 
    { 
     Launch(); 
     Thread.Sleep(Timeout.Infinite); 
    } 

    static void Launch() 
    { 
     Process process = new Process(); 
     process.StartInfo.FileName = "MyApp.exe"; 
     process.EnableRaisingEvents = true; 
     process.Exited += LaunchIfCrashed; 
    } 

    static void LaunchIfCrashed(object o, EventArgs e) 
    { 
     Process process = (Process) o; 
     if (process.ExitCode != 0) 
     { 
      if (count-- > 0) // restart at max count times 
       Launch(); 
      else 
       Environment.Exit(process.ExitCode); 
     } 
     else 
     { 
      Environment.Exit(0); 
     } 
    } 
+1

L'unico aggiornamento possibile sarebbe quello di rendere il "cane da guardia" un servizio di Windows. –

+0

meglio aggiungere un po 'di timestamp e rilevare se l'app si è bloccata all'avvio – Sean

1

Una possibile soluzione è quella di creare un altro processo per monitorare l'applicazione e riavviarlo se è terminata:

class ProcessMonitorProgram 
{ 
    const string myProcess = "MyApp.exe"; 

    static void Main() 
    { 
     new Timer(CheckProcess, null, 0, 60 * 1000); 
     Thread.Sleep(Timeout.Infinite); 
    } 

    static void CheckProcess(object obj) 
    { 
     if (Process.GetProcessesByName(myProcess).Length == 0) 
      Process.Start(myProcess); 
    } 
} 

Uno dei problemi con questa soluzione è che non mancherà di tenere il processo di riavvio per sempre, fino a quando questa applicazione di monitoraggio stessa è terminata.

5
  • eseguire il lavoro all'interno di un dominio di applicazione; utilizzare l'AppDomain principale per monitorarlo (non proteggersi dall'uccisione del processo, però)
  • un sacco di gestione delle eccezioni! vale a dire non lasciare che un errore fatale abbattere il processo
  • eseguirlo in qualcosa che ha già costruito nel riciclaggio - IIS, ad esempio
+1

Grazie Marc. Potresti aggiungere un esempio su come implementare la soluzione basata su AppDomain che suggerisci? –

+0

Supponendo che si tratti di un'app Windows Form o console, è possibile utilizzare Application.Restart - vedere la mia risposta per i dettagli. – RoadWarrior

8

Se questo è un Windows Form app:

  • Set jitDebugging = true in App.Config. Ciò impedisce l'attivazione del gestore di eccezioni non gestito di Windows Form incorporato.

Ora indipendentemente dal fatto che si tratta di una Windows Form app o una console app:

  • Registro per l'Application.ThreadException evento, ad esempio, in C#:

    Application.ThreadException + = new Threading.ThreadExceptionHandler (CatchFatalException);

A questo punto, la tua app è già entrata in un buco nero. Quello che accade poi dipende dal fatto che o non questo è un Windows Form app:

  • Se si tratta di un Windows Form app, chiamare il metodo Application.Restart nel vostro CatchFatalException gestore di eventi.
  • Altrimenti sarà necessario p/invocare le funzioni native application restart and recovery. Quel collegamento parla di Vista, ma nei miei test funziona perfettamente anche su XP.
+0

Grazie. È possibile che un'applicazione di console esegua qualcosa di simile a 'Application.ThreadException + = MyHandler;'? –

+0

Sì, un'applicazione per console può fare lo stesso. – RoadWarrior

+0

Ma non ha accesso alla classe Application, vero? –

Problemi correlati