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

Pet*_*y B 14 c# windows-services

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

protected override void OnStop()
{
    threadRunning = false;

    this.ExitCode = 0;
    base.OnStop();
}
Run Code Online (Sandbox Code Playgroud)

Pau*_*ams 12

ServiceBase.OnStop上的文档:

期望在派生类中重写OnStop.要使服务有用,OnStart和OnStop都应该在您的服务类中实现.

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

只需浏览一下ServiceBase.cs的.NET源代码,就会发现该方法无效:

protected virtual void OnStop()
{
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这是继承的隐含成本,只有好的文档才能解决这个问题.ServiceBase类在必须被设计为抽象类的边缘摇摇欲坠.OnStart和OnStop是抽象的,因此不会有任何猜测. (6认同)
  • "善于称呼"的事情是一个愚蠢的想法.如果基础实现确实发生了变化 - 你什么时候打电话给它?在您自己的代码之前或之后?要知道是否要打电话,有太多未知数,你完全可以通过文档来填补空白 - 所以除非文档告诉你打电话,否则我不会打扰.IMO - 调用基本方法的能力是一个愚蠢的想法,如果没有它,语言会更好.:p (5认同)

Jon*_*eet 6

你不必.它只是意味着如果你ServiceBase在实际服务之间插入一个额外的基类,你将调用它的OnStop方法,如果它被覆盖.我不相信ServiceBase.OnStop自己会采取任何行动.

通常,在覆盖IMO时调用基本方法是个好主意,除非您特别想要阻止"正常"行为发生......但在这种情况下,省略该调用不会产生任何不良影响.


Phi*_*eck 6

你不需要.

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

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