Come posso rilevare che la mia applicazione .NET si è arrestata in modo anomalo e quindi riavviarla?Rilevamento e riavvio dell'applicazione .NET bloccata
risposta
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);
}
}
L'unico aggiornamento possibile sarebbe quello di rendere il "cane da guardia" un servizio di Windows. –
meglio aggiungere un po 'di timestamp e rilevare se l'app si è bloccata all'avvio – Sean
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.
- 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
Grazie Marc. Potresti aggiungere un esempio su come implementare la soluzione basata su AppDomain che suggerisci? –
Supponendo che si tratti di un'app Windows Form o console, è possibile utilizzare Application.Restart - vedere la mia risposta per i dettagli. – RoadWarrior
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.
Grazie. È possibile che un'applicazione di console esegua qualcosa di simile a 'Application.ThreadException + = MyHandler;'? –
Sì, un'applicazione per console può fare lo stesso. – RoadWarrior
Ma non ha accesso alla classe Application, vero? –
- 1. Errore del servizio Windows sporadico sotto .NET 4, seguito dalla porta bloccata al tentativo di riavvio
- 2. Rilevamento di funzioni durante P/Invocazione in C# e .NET
- 3. Eliminazione di un'attività bloccata in .NET 4 TPL
- 4. .NET framework compatto - rilevamento se in emulatore?
- 5. Rilevamento URL dell'immagine in C#/NET
- 6. Riavvio di un filo a .NET (con C#)
- 7. Errore nelle proprietà del file di progetto e progettista .net è bloccata
- 8. Rilevamento client e-mail
- 9. Hazelcast Map è bloccata
- 10. Riavvio postgres
- 11. Riavvio Supervisore e effetto sulla FlaskSocketIO
- 12. Rilevamento positivo falso del programma C# .net dall'antivirus come trojan
- 13. Libreria NET per il rilevamento di tipo file/mime
- 14. Rilevamento delle immagini in scala di grigi con .Net
- 15. Promemoria mango nella schermata bloccata
- 16. 'Cartella' già bloccata da 'Cartella'
- 17. Elaborazione multipla in python bloccata
- 18. Libreria CDN bloccata in Chrome
- 19. Riavvio di uno storyboard WPF
- 20. A CellTable GWT con intestazione bloccata e colonna iniziale
- 21. riavvio sequenziale di capistrano
- 22. esempio Riavvio Upstart elabora
- 23. Android Riavvio dell'applicazione
- 24. Rilevamento modifiche non salvate
- 25. Rilevamento della versione di Excel installata (e Service Pack)
- 26. Servizio Windows non automatico Avvio al riavvio
- 27. Aggiunta dell'app .NET al registro per l'avvio dopo il riavvio per completare alcune azioni
- 28. Rilevamento di collisione e modello di attore
- 29. Calcolo del bit di flag e rilevamento
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. –
Aggiunte informazioni sul riavvio di un'app console, poiché apparentemente è ciò che si sta utilizzando. – RoadWarrior