2010-09-01 61 views
14

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

protected override void OnStop() 
{ 
    threadRunning = false; 

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

与你的问题无关,但值得注意的是:不要使用'thread.Abort();'。 – dtb 2010-09-01 16:32:29

+0

@dtp,正式记录 – 2010-09-01 16:43:59

回答

12

从文档上ServiceBase.OnStop

调用OnStop预计 派生类被重写。对于服务 是有用的,OnStart和OnStop应 都在您的服务 类实施。

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

在为ServiceBase.cs的.NET源代码一瞥揭示方法不起作用:

protected virtual void OnStop() 
{ 
} 

所以,你需要调用它?不,但这样做仍然是一种很好的形式。基地实施可能有一天会改变。

+4

“好的叫它”的事情是一个愚蠢的想法。如果基础实现有变化 - 你什么时候调用它?你自己的代码之前还是之后?太多的未知数知道是否打电话,你完全由文档来填补空白 - 所以除非文档告诉你打电话,我不会打扰。国际海事组织(IMO) - 调用基本方法的能力是一个愚蠢的想法,如果没有它,语言会更好。 :p – 2010-09-01 18:14:14

+6

这是隐含的继承成本,只有好的文档才能解决这个问题。 ServiceBase类在必须被设计为抽象类的边缘摇摇欲坠。 OnStart和OnStop是抽象的,所以不会有任何猜测。 – 2010-09-01 18:33:05

6

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

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

6

你不需要。

OnStop是一个在ServiceBase中定义的虚拟方法,允许您覆盖可以处理停止服务的地方。在(稍微)一般情况下,当你重写一个虚拟方法时,你也可以调用基本虚拟方法。唯一一次你不叫它是当你想停止正常的事情发生。

在Servicebase的情况下,OnStop什么都不做,所以你不需要调用它。

2

您实际上不必拨打该电话。如果您使用Reflector查看ServiceBase类中的OnStop方法,您将看到它完全没有任何作用。