c# - studio - ¿Cuál es la forma correcta de salir de Windows Service OnStart si la configuración es incorrecta y no hay nada que hacer?
windows service c# (3)
Esto es lo que conseguí:
protected override void OnStart(string[] args)
{
if (SomeApp.Initialize())
{
SomeApp.StartMonitorAndWork();
base.OnStart(args);
}
}
protected override void OnStop()
{
SomeApp.TearDown();
base.OnStop();
}
Aquí, Initialize lee un archivo de configuración y, si está mal, no hay nada que hacer. ¡El servicio debe DETENERSE! Si config está bien, StartMonitorAndWork comienza:
Timer(new TimerCallback(DoWork), null, startTime, loopTime);
y la base de datos de encuestas DoWork periódicamente.
Si la inicialización falla (verifico el archivo de registro) y trato de detener el servicio desde Herramientas administrativas -> Servicios, obtengo:
Could not stop the SomeService on Local Computer. The service did not return an error. This could be internal Windows error or an internal service error. If the problem persists, contact system administrator.
The question is: "Is exiting OnStart without doing nothing enough if Initialize returns false?
O debería haber algo como esto:
private void ExitService()
{
this.OnStop();
System.Environment.Exit(1);
}
protected override void OnStart(string[] args)
{
if (ObjectFolderApp.Initialize())
{
SomeApp.StartMonitorAndWork();
base.OnStart(args);
}
else
{
ExitService();
}
}
Gracias y BR - Matti
EDIT: se me ocurrió algo como esto:
protected override void OnStart(string[] args)
{
try
{
if (SomeApp.Initialize())
{
SomeApp.StartMonitorAndWork();
base.OnStart(args);
}
else
{
Stop();
}
}
catch
{
Stop();
}
}
protected override void OnStop()
{
try
{
SomeApp.TearDown();
base.OnStop();
}
catch
{
base.OnStop();
}
}
Después de probar todos los enfoques, yo personalmente prefiero llamar
Environment.FailFast("Configuration is wrong.");
El objetivo principal es que la explicación de la falla se escriba en el Registro de eventos y FailFast afecta a la configuración de recuperación de su servicio. Entonces, si configura la recuperación y la configuración se corrige, su servicio se iniciará automáticamente.
Me gustaría registrar un error en el registro de eventos si Initialize()
devuelve falso con algún mensaje sensato que diga mientras falla, y le gustaría que sugiera llamar a OnStop()
si falla. Es una buena práctica asegurar el correcto cierre del servicio.
También vea esta pregunta SO relacionada y el subgrupo de grupos de noticias dev .
Sé que no es bonito, pero lanzar una excepción en OnStart también funciona.
Si su servicio está configurado para "Autolog", esto también escribirá automáticamente su mensaje de excepción en el EventLog.
protected override void OnStart(string[] args)
{
if (ObjectFolderApp.Initialize())
{
SomeApp.StartMonitorAndWork();
base.OnStart(args);
}
else
{
throw new Exception("What went wrong");
}
}