Подтвердить что ты не робот

Каков правильный путь выхода из Windows Service OnStart, если конфигурация неправильная и нечего делать?

Вот что я получил:

protected override void OnStart(string[] args)
{
    if (SomeApp.Initialize())
    {
        SomeApp.StartMonitorAndWork();
        base.OnStart(args);
    }
}

protected override void OnStop()
{
    SomeApp.TearDown();
    base.OnStop();
}

Здесь Initialize читает файл конфигурации, и если он ошибается, то ничего не нужно делать, чтобы служба STOP! Если конфигурация в порядке, запускается 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();
    }
}

Спасибо и BR - Matti

EDIT: Я придумал что-то вроде этого:

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();
    }
}
4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Если ваша служба настроена на "Автолог", это также автоматически напишет ваше сообщение об исключении в EventLog.

protected override void OnStart(string[] args)
{
    if (ObjectFolderApp.Initialize())
    {
        SomeApp.StartMonitorAndWork();
        base.OnStart(args);
    }
    else
    {
        throw new Exception("What went wrong");
    }
}

Ответ 3

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

Также см. этот связанный вопрос SO и dev newsgroup thread.

Ответ 4

Я рекомендую вам что-то вроде этого:

protected override void OnStop()
{
    try
    {
        EventLog.WriteEntry("MyService", "Service is going to stop because of ...", EventLogEntryType.Information);        
        // Dispose all your objects here        
    }
    catch (Exception ex)
    {
        EventLog.WriteEntry("MyService", "Exception : " + ex.ToString(), EventLogEntryType.Error);                
    }
    finally
    {
        GC.Collect();                
        base.OnStop();
    }
}