【问题标题】:Why call base.OnStop() when Windows Service is stopped?为什么在 Windows 服务停止时调用 base.OnStop()?
【发布时间】:2010-09-01 16:26:58
【问题描述】:

我正在创建一个 C#.Net Windows 服务,我想知道您是否总是必须在服务的 OnStop() 方法中调用 base.OnStop();,为什么?

protected override void OnStop()
{
    threadRunning = false;

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

【问题讨论】:

  • 与您的问题无关,但值得注意:不要使用thread.Abort();

标签: c# windows-services


【解决方案1】:

来自ServiceBase.OnStop上的文档:

OnStop 预计将在 派生类。为了服务 有用, OnStart 和 OnStop 应该 两者都在您的服务中实施 类。

所以它实际上被用作通知您的服务它正在停止。

查看 ServiceBase.cs 的 .NET 源代码会发现该方法什么都不做:

protected virtual void OnStop()
{
}

那么,你需要调用它吗?不,但这样做仍然是一种很好的形式。基础实现可能有一天会改变。

【讨论】:

  • “说得好”是个愚蠢的想法。如果基本实现确实发生了变化 - 你什么时候调用它?在您自己的代码之前还是之后?太多未知数不知道是否要打电话,您完全取决于文档来填补空白 - 所以除非医生告诉您打电话,否则我不会打扰。 IMO - 调用基本方法的能力是一个愚蠢的想法,没有它,语言会更好。 :p
  • 这是隐含的继承成本,只有好的文档才能解决这个问题。 ServiceBase 类在必须设计为抽象类的边缘摇摆不定。 OnStart 和 OnStop 是抽象的,所以不会有任何猜测。
【解决方案2】:

您不必这样做。这只是意味着如果您在ServiceBase 和您的实际服务之间插入一个额外的基类,如果它被覆盖,您将调用它的OnStop 方法。我不相信ServiceBase.OnStop 本身会执行任何操作。

通常在重写 IMO 时调用基本方法是个好主意,除非您特别想防止发生“正常”行为……但在这种情况下,省略调用不会有任何问题效果。

【讨论】:

    【解决方案3】:

    你不需要。

    OnStop 是 ServiceBase 中定义的虚拟方法,允许您在其中处理服务停止的覆盖。在(有点)一般情况下,当您覆盖虚拟方法时,您也调用了基本虚拟方法。只有当你想阻止正常的事情发生时,你才不会调用它。

    对于 Servicebase,OnStop 什么都不做,所以你不需要调用它。

    【讨论】:

      【解决方案4】:

      您实际上不必打那个电话。如果您使用 Reflector 查看 ServiceBase 类中的 OnStop 方法,您会发现它什么也没做。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-22
        • 1970-01-01
        • 1970-01-01
        • 2018-04-05
        • 1970-01-01
        • 2013-03-11
        • 2015-01-17
        • 1970-01-01
        相关资源
        最近更新 更多