2011-09-13 18 views
11

Tengo un servicio de Windows que estoy intentando depurar. Ahora no puede iniciarse aunque el código actual solía funcionar. El error es:El servicio de Windows no se iniciará (Error 1053)

Windows no pudo iniciar el servicio MyService el equipo local

Error 1053: El servicio no respondió al inicio o control petición en el momento oportuno.

Para aislar el error, traté de comentar todo. El principal método es el siguiente:

TextWriter tt = new StreamWriter(@"C:\startup.text", true); 
tt.WriteLine("Starting up the service"); 
tt.Close(); 

ServiceBase[] ServicesToRun; 
ServicesToRun = new ServiceBase[] 
    { 
     new MyService() 
    }; 

TextWriter tt2 = new StreamWriter(@"C:\startup.text", true); 
tt2.WriteLine("Run..."); 
tt2.Close(); 

Se imprime tanto "Puesta en marcha del servicio" y "Ejecutar ..." para el archivo de registro. También eliminé el interior de MyService para que esté vacío. Hay un try/catch alrededor de cualquier código, que ahora se reduce a algunas líneas de registro como la anterior. Nunca ingreso la declaración catch, que la habría registrado.

Todo en OnStart ha comentado:

protected override void OnStart(string[] args) 
{ 
} 

Así que estoy básicamente sin ideas. Pensé que el error se debía a que el método de inicio nunca termina (o no dentro de 30 segundos). ¿Hay algún otro método que se llame? Cualquier idea es apreciada.

Información extra: El constructor en MyService está vacío. Si inserto algunas líneas Thread.Sleep (5000), tarda más tiempo antes de que aparezca el mensaje de error sobre el error 1053. El método principal parece tener que salir (sin error).

+0

Asegúrese de detectar todas las excepciones no controladas y escriba el m a su registro. Por ejemplo: http://stackoverflow.com/questions/58280/unhandledexception-handler-in-a-net-windows-service ... que podría darle más información sobre por qué está fallando. –

Respuesta

15

se echa en falta ServiceBase.Run llamada:

ServiceBase[] servicesToRun = new ServiceBase[] 
           { 
            new MyService() 
           }; 
ServiceBase.Run(servicesToRun); 

También podría ser una buena idea para suscribirse a las excepciones no controladas notificación:

static void Main() { 
    ... 
    AppDomain.CurrentDomain.UnhandledException 
             += CurrentDomain_UnhandledException; 
    ... 
} 

private static void CurrentDomain_UnhandledException(
               Object sender, 
               UnhandledExceptionEventArgs e) { 

    if (e != null && e.ExceptionObject != null) { 
     // log exception: 
    } 
} 

Y añadir siguiente try/catch para OnStart porque .NET/SCM se traga excepciones:

protected override void OnStart(String[] args) { 
    try { 

    } catch(Exception e) { 
     // log exception: 
     throw; 
    } 
} 
+1

Además, si desea depurar la inicialización del servicio, puede poner una llamada a System.Diagnostics.Debugger.Break() en el código de inicialización. Cuando se llegue a esta línea, Windows le preguntará si desea iniciar el depurador, lo que le permitirá depurar el servicio desde ese punto. – Polyfun

+1

Gracias. El ServiceBase.Run (servicesToRun); línea fue comentada en el proceso. –

+1

Para mí, fue el conjunto condicional de depuración para ejecutar sin llamar a 'ServiceBase.Run (serviceToRun);' – absynce

Cuestiones relacionadas