Sono abbastanza nuovo per i servizi di Windows. Ho creato un programma di installazione per il mio servizio Windows C# e l'installazione sul server (Windows Server 2003) sembra aver funzionato. Quando viene avviato, scrive Service started successfully
nel registro. Quando viene fermato, scrive Service stopped successfully
. Tuttavia, a volte il servizio si arresta senza scrivere nulla nel log, quindi lo riavvio manualmente. Quando guardo il registro in seguito, dice Service started successfully
come previsto. È strano vedere che nel registro due volte di fila è evidente che manca una voce in cui il servizio ha in qualche modo smesso di funzionare.Perché il mio C# servizio Windows smette di funzionare senza che nessun messaggio venga scritto nel registro eventi dell'applicazione?
Quali potrebbero essere le potenziali cause di questo? Ho il servizio configurato come automatico e l'ho installato per funzionare per tutti gli utenti. Ho avuto l'impressione che ciò significhi che il servizio si avvia automaticamente ogni volta che si avvia la macchina. Come posso scoprire perché si è fermato? I servizi che si arrestano in modo anomalo si scrivono automaticamente nel registro eventi o devo gestire le eccezioni in modo tale che registrino il proprio motivo per l'arresto anomalo?
Edit: Alcune informazioni aggiuntive:
- l'ho impostato per accedere come account di sistema locale
- Sotto Opzioni di ripristino, l'ho impostato per riavviare il primo fallimento. Non ho nulla per il secondo o successivi fallimenti.
Aggiornamento: Un rispondente ha consigliato un gestore di eccezioni globale. Anche se non lo implementerò come una correzione permanente, mi aiuterà almeno a capire dove si sta verificando il problema. Ho effettivamente provato questo con il mio servizio installato e funziona. Ho scoperto che le eccezioni non gestite effettivamente causano il crash del servizio senza scrivere nulla sul log. Ho pensato che avrebbe almeno riportato qualche errore dell'applicazione, ma non è così.
static void Main()
{
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
//other code here
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Utilities.WriteIt(e.ExceptionObject as Exception);
}
Hai controllato il registro eventi? – pms1969