Pregunta

Estoy escribiendo una serie de servicios de Windows. Quiero que fallen si se producen errores durante el inicio (en el método OnStart () ). Había asumido que simplemente lanzar un error en OnStart () haría esto, pero estoy encontrando que en su lugar " Comienza " y me presenta un mensaje que dice "El servicio ha comenzado, pero está inactivo. ¿Es correcto? & Quot; (Paráfrasis). ¿Cómo manejo el error para que realmente no pueda iniciar el servicio?

¿Fue útil?

Solución

si está ejecutando .NET 2.0 o superior, puede usar ServiceBase.Stop para detener el servicio desde OnStart. De lo contrario, llame a Detener desde un nuevo hilo.

ref [devnewsgroups] ( http: /www.devnewsgroups.net/group/microsoft.public.dotnet.framework/topic50404.aspx )

(grupo de noticias desaparecido)

Otros consejos

Si lo principal que desea es que la ventana Servicios informe que hubo un error, por lo que he intentado (.net 3.5 en Windows 7), la única forma de hacerlo es configurando el código de salida. Recomiendo configurarlo en 13816, ya que esto da como resultado el mensaje, " Se ha producido un error desconocido " Consulte los códigos de error de Windows .

La muestra de abajo logra tres cosas. 1: la configuración de ExitCode da como resultado un mensaje útil para el usuario final. No afecta el registro de la aplicación de Windows, pero sí incluye un mensaje en el registro del sistema. 2: los resultados de Detención de llamada en un " Servicio detenido con éxito " mensaje en el registro de la aplicación. 3: lanzar los resultados de la excepción en una entrada de registro útil en el registro de la aplicación.

protected override void OnStart(string[] args) {

  try {
    // Start your service
  }
  catch (Exception ex) {
    // Log exception
    this.ExitCode = 13816;
    this.Stop();
    throw;
  }

}

Mueva toda su lógica de inicio a un método separado, y Tire las excepciones (o llame a OnStop) desde ese método separado.

OnStart tiene algunas rarezas al iniciar. Descubrí que si OnStart () no tiene más de una línea, no obtengo el " El servicio se inició y luego se detuvo. Algunos servicios se detienen automáticamente si no tienen trabajo que hacer " El mensaje y las excepciones iniciadas terminarán el proceso y se registrarán en el registro de eventos de la aplicación.

También con el método de inicio separado, puede utilizar una técnica como esta para depurar sin adjuntar. http://www.codeproject.com/KB/dotnet/DebugWinServices.aspx

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top