Как правильно выйти из Windows Service OnStart, если конфигурация неверна и ничего не нужно делать? - PullRequest
29 голосов
/ 21 апреля 2010

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

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

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

Здесь Initialize читает файл конфигурации, и если он не в порядке, то ничего не нужно делать, поэтому служба должна ОСТАНОВИТЬСЯ!Если конфигурация в порядке, 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 - Матти

РЕДАКТИРОВАТЬ: я придумал что-то вроде этого:

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

Ответы [ 4 ]

10 голосов
/ 21 апреля 2010

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

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

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

3 голосов
/ 21 апреля 2010

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

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

protected override void OnStart(string[] args)
{
    if (ObjectFolderApp.Initialize())
    {
        SomeApp.StartMonitorAndWork();
        base.OnStart(args);
    }
    else
    {
        throw new Exception("What went wrong");
    }
}
2 голосов
/ 21 апреля 2010

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

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

0 голосов
/ 16 января 2019

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

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