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

时间:2010-09-01 16:26:58

标签: c# windows-services

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

protected override void OnStop()
{
    threadRunning = false;

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

4 个答案:

答案 0 :(得分:12)

来自ServiceBase.OnStop的文档:

  

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

所以它真的被用作服务的通知,它正在停止。

浏览ServiceBase.cs的.NET源代码可以发现该方法无效:

protected virtual void OnStop()
{
}

那么,你需要打电话吗?不,但这样做还是很好的形式。基础实现有一天可能会改变。

答案 1 :(得分:6)

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

通常在你覆盖IMO时调用基本方法是个好主意,除非你特别想要防止“正常”行为发生......但在这种情况下,省略调用将不会有任何不适的效果。

答案 2 :(得分:6)

你不需要。

OnStop是ServiceBase中定义的虚方法,允许您覆盖服务停止处理。在(有些)一般情况下,当您覆盖虚方法时,也会调用基本虚方法。你没有打电话的唯一一次是当你想要阻止正常事情发生时。

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

答案 3 :(得分:2)

你实际上不必拨打电话。如果你使用Reflector查看ServiceBase类中的OnStop方法,你会发现它什么都不做。