Soy bastante nuevo en los servicios de Windows. Creé un instalador para mi servicio C# Windows y la instalación en el servidor (Windows Server 2003) parece haber funcionado. Cuando se inicia, escribe Service started successfully
en el registro. Cuando se detiene, escribe Service stopped successfully
. Sin embargo, a veces el servicio deja de ejecutarse sin escribir nada en el registro, por lo que lo inicio de nuevo manualmente. Cuando miro el registro después, dice Service started successfully
como se esperaba. Es extraño ver en el registro dos veces seguidas que obviamente falta una entrada donde el servicio de alguna manera ha dejado de ejecutarse.¿Por qué mi servicio de Windows C# deja de ejecutarse sin que se escriban mensajes en el registro de eventos de la aplicación?
¿Cuáles podrían ser las posibles causas de esto? Tengo el servicio configurado como automático y lo instalé para que se ejecute para todos los usuarios. Tenía la impresión de que esto significa que el servicio se inicia automáticamente cada vez que la máquina arranca. ¿Cómo puedo averiguar por qué se detuvo? ¿Los servicios que bloquean se escriben automáticamente en el registro de eventos o tengo que manejar las excepciones de tal manera que registran su propio motivo del bloqueo?
Editar: Alguna información adicional:
- lo tengo configurado para iniciar sesión como cuenta del sistema local
- Bajo Opciones de recuperación, lo tengo configurado para reiniciar el primer fracaso. No tengo nada para fracasos secundarios o subsiguientes.
Actualización: Un contestador recomendó un controlador de excepción global. Si bien no implementaré esto como una solución permanente, al menos me ayudará a descubrir dónde está ocurriendo el problema. De hecho, probé esto con mi servicio instalado y funciona. Descubrí que las excepciones no controladas realmente bloquean el servicio sin escribir nada en el registro. Pensé que al menos reportaría algún error de aplicación, pero no es así.
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);
}
¿Has comprobado el EventLog? – pms1969