Зачем вызывать base.OnStop(), когда служба Windows остановлена?

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

protected override void OnStop()
{
    threadRunning = false;

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

Ответы

Ответ 1

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

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

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

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

protected virtual void OnStop()
{
}

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

Ответ 2

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

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

Ответ 3

Вам не нужно.

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

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

Ответ 4

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