Что правильный путь состоит в том, чтобы выйти из службы Windows OnStart, если конфигурация является неправильной и ничто, чтобы сделать?

Это - то, что я получил:

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();
    }
}
29
задан NekojiruSou 26 September 2017 в 15:47
поделиться

3 ответа

после тестирования всех подходов, которые я лично предпочитаю называть

Environment.FailFast("Configuration is wrong.");

Основная цель состоит в том, чтобы объяснение сбоя записывалось в журнал событий, а FailFast влиял на настройки восстановления вашей службы. Поэтому, если вы настроите восстановление и конфигурация будет правильной, ваша служба запустится автоматически.

10
ответ дан 28 November 2019 в 02:09
поделиться

Я бы записал ошибку в журнал событий if Initialize () возвращает false с некоторым разумным сообщением о том, что он терпит неудачу, и вы должны предложить вызвать OnStop () в случае неудачи. Хорошая практика - обеспечить правильное завершение работы службы.

Также см. этот связанный вопрос SO и ветку группы новостей разработчиков .

2
ответ дан 28 November 2019 в 02:09
поделиться

Я знаю, что это некрасиво, но выдача исключения в OnStart тоже работает.

Если ваша служба настроена на «Автолог», это также автоматически запишет ваше сообщение об исключении в журнал событий.

protected override void OnStart(string[] args)
{
    if (ObjectFolderApp.Initialize())
    {
        SomeApp.StartMonitorAndWork();
        base.OnStart(args);
    }
    else
    {
        throw new Exception("What went wrong");
    }
}
3
ответ дан 28 November 2019 в 02:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: