C# 为什么在Windows服务停止时调用base.OnStop()?

C# 为什么在Windows服务停止时调用base.OnStop()?,c#,windows-services,C#,Windows Services,我正在创建一个C#.Net Windows服务,我想知道您是否总是需要调用base.OnStop(),为什么 protected override void OnStop() { threadRunning = false; this.ExitCode = 0; base.OnStop(); } 你不必这么做。这只是意味着,如果您在ServiceBase和实际服务之间插入一个额外的基类,那么如果它被覆盖,您将调用该基类的OnStop方法。我不相信ServiceBase

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

protected override void OnStop()
{
    threadRunning = false;

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

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

通常,在重写IMO时调用基本方法是一个好主意,除非您特别希望防止“正常”行为发生。。。但是在这种情况下,省略呼叫不会产生任何不良影响。

您不需要这样做

OnStop是在ServiceBase中定义的虚拟方法,允许您在其中处理服务停止的重写。在(某种程度上)一般情况下,重写虚方法时,也会调用基本虚方法。你唯一不打电话的时候就是想阻止正常的事情发生

对于Servicebase,OnStop不执行任何操作,因此您无需调用它。

来自以下站点的文档:

OnStop预计将在中被覆盖 派生类。为服务于 是有用的,OnStart和OnStop应该 两者都可以在您的服务中实现 班级

因此,它实际上是用来通知您的服务正在停止

浏览一下ServiceBase.cs的.NET源代码,就会发现该方法不起任何作用:

protected virtual void OnStop()
{
}

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

实际上,您不必进行这种调用。如果您使用Reflector查看ServiceBase类中的OnStop方法,您将看到它什么也不做。

与您的问题无关,但值得注意的是:不要使用
thread.Abort()“叫它好”是一个愚蠢的想法。如果基本实现曾经发生过变化,您何时调用它?在你自己的代码之前还是之后?有太多的未知因素不知道是否要打电话,你完全要依靠文档来填补空白——因此,除非文档告诉你打电话,否则我不会麻烦你。IMO-调用基本方法的能力是一个愚蠢的想法,没有它,语言会更好p这是继承的隐含成本,只有好的文档才能解决这个问题。ServiceBase类在不得不被设计为抽象类的边缘摇摇欲坠。由于OnStart和OnStop是抽象的,因此不会有任何猜测。