Зачем вызывать base.OnStop (), когда служба Windows остановлена? - PullRequest
14 голосов
/ 01 сентября 2010

Я создаю C # .Net Windows Service и мне интересно, нужно ли вам всегда вызывать base.OnStop(); в методе OnStop() службы и почему?

protected override void OnStop()
{
    threadRunning = false;

    this.ExitCode = 0;
    base.OnStop();
}

Ответы [ 4 ]

12 голосов
/ 01 сентября 2010

Из документации по ServiceBase.OnStop :

Ожидается, что OnStop будет переопределен в производном классе.Чтобы служба была полезной, OnStart и OnStop должны быть реализованы в вашем классе обслуживания.

Таким образом, он действительно используется как уведомление для вашей службы, что он останавливается.

Aвзгляд на исходный код .NET для ServiceBase.cs показывает, что метод ничего не делает:

protected virtual void OnStop()
{
}

Итак, вам нужно вызвать его?Нет. Но это все еще хорошая форма для этого.Базовая реализация может когда-нибудь измениться.

6 голосов
/ 01 сентября 2010

Вам не нужно.

OnStop - это виртуальный метод, определенный в ServiceBase, чтобы позволить вам переопределить, где вы можете обрабатывать остановку службы. В (несколько) общем случае, когда вы переопределяете виртуальный метод, вы также вызываете базовый виртуальный метод. Единственный раз, когда вы не звоните, это когда вы хотите остановить нормальные вещи.

В случае Servicebase OnStop ничего не делает, поэтому вам не нужно его вызывать.

6 голосов
/ 01 сентября 2010

Вам не нужно.Это просто означает, что если вы когда-нибудь вставите дополнительный базовый класс между ServiceBase и вашим реальным сервисом, вы вызовете метод OnStop этого, если он переопределен.Я не верю, что ServiceBase.OnStop сам выполняет какие-либо действия.

Обычно рекомендуется вызывать базовый метод, когда вы переопределяете IMO, если вы специально не хотите предотвратить "нормальное" поведение.... но в этом случае пропуск вызова не будет иметь вредных последствий.

2 голосов
/ 01 сентября 2010

На самом деле вам не нужно делать этот звонок.Если вы посмотрите на метод OnStop в классе ServiceBase, используя Reflector, то увидите, что он вообще ничего не делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...