Зачем вызывать 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, вы увидите, что он ничего не делает.