Это - то, что я получил:
protected override void OnStart(string[] args)
{
if (SomeApp.Initialize())
{
SomeApp.StartMonitorAndWork();
base.OnStart(args);
}
}
protected override void OnStop()
{
SomeApp.TearDown();
base.OnStop();
}
Здесь Инициализируйте, читает файл конфигурации и если это неправильно, там не имеет отношения так, сервис должен ОСТАНОВИТЬСЯ! Если конфигурация в порядке, StartMonitorAndWork запускается:
Timer(new TimerCallback(DoWork), null, startTime, loopTime);
и DoWork периодически опрашивает базу данных.
Если Инициализируют сбои (я проверяю файл журнала), и я пытаюсь остановить сервис от Средств администрирования-> Сервисы, которые я получаю:
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?
ИЛИ должно там быть что-то вроде этого:
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();
}
}
Thanks & BR - Matti
Править: Я придумал что-то вроде этого:
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();
}
}
после тестирования всех подходов, которые я лично предпочитаю называть
Environment.FailFast("Configuration is wrong.");
Основная цель состоит в том, чтобы объяснение сбоя записывалось в журнал событий, а FailFast влиял на настройки восстановления вашей службы. Поэтому, если вы настроите восстановление и конфигурация будет правильной, ваша служба запустится автоматически.
Я бы записал ошибку в журнал событий if Initialize ()
возвращает false с некоторым разумным сообщением о том, что он терпит неудачу, и вы должны предложить вызвать OnStop ()
в случае неудачи. Хорошая практика - обеспечить правильное завершение работы службы.
Также см. этот связанный вопрос SO и ветку группы новостей разработчиков .
Я знаю, что это некрасиво, но выдача исключения в OnStart тоже работает.
Если ваша служба настроена на «Автолог», это также автоматически запишет ваше сообщение об исключении в журнал событий.
protected override void OnStart(string[] args)
{
if (ObjectFolderApp.Initialize())
{
SomeApp.StartMonitorAndWork();
base.OnStart(args);
}
else
{
throw new Exception("What went wrong");
}
}