服务应用程序编程体系结构

注意

本文不适用于 .NET 中的托管服务。 有关使用 Microsoft.Extensions.Hosting.BackgroundService 的 Windows 服务上的最新内容和辅助角色服务模板,请参阅:

Windows 服务应用程序基于从 System.ServiceProcess.ServiceBase 类继承的类。 可以替代此类中的方法并为其定义功能,以确定服务的行为方式。

服务创建中涉及的主要类包括:

另外,可以使用名为 ServiceController 的类来操纵服务本身。 该类不参与创建服务,但可用于启动和停止服务、将命令传递给它并返回一系列枚举。

定义服务的行为

在服务类中,替代基类函数,这些函数可确定服务状态在服务控制管理器中更改时会发生什么情况。 ServiceBase 类公开以下方法,可替代这些方法以添加自定义行为。

方法 替代为
OnStart 指示服务开始运行时应采取的操作。 必须在此过程中为服务编写代码才能执行有用的操作。
OnPause 指示在服务暂停时应发生什么情况。
OnStop 指示在服务停止运行时应发生什么情况。
OnContinue 指示服务在暂停后恢复正常运行时应发生什么情况。
OnShutdown 指示在系统关闭之前应发生什么情况(如果此时服务正在运行)。
OnCustomCommand 指示服务在收到自定义命令时应发生什么情况。 有关自定义命令的详细信息,请参阅 MSDN Online。
OnPowerEvent 指示服务在收到电源管理事件时应如何响应,如电池电量不足或已挂起的操作。

注意

这些方法表示服务在其生存期中不断变化的状态;服务从一个状态转换到下一个状态。 例如,在调用 OnStart 之前,将永远无法获得该服务来响应 OnContinue 命令。

还有其他几个令人感兴趣的属性和方法。 这些方法包括:

  • ServiceBase 类的 Run 方法。 这是服务的主入口点。 使用 Windows 服务模板创建服务时,将在应用程序的 Main 方法中插入代码以运行该服务。 此代码如下所示:

    ServiceBase[] ServicesToRun;
    ServicesToRun = new ServiceBase[]
        { new Service1() };
    Run(ServicesToRun);
    
    Dim ServicesToRun() As System.ServiceProcess.ServiceBase
    ServicesToRun =
        New System.ServiceProcess.ServiceBase() {New Service1()}
    System.ServiceProcess.ServiceBase.Run(ServicesToRun)
    

    注意

    这些示例使用 ServiceBase 类型的数组,可将应用程序包含的每项服务添加到其中,然后所有服务均可一同运行。 但是,如果仅创建单个服务,则可以选择不使用该数组,然后只声明从 ServiceBase 继承的新对象,然后运行它。 有关示例,请参见 如何:以编程方式编写服务

  • ServiceBase 类的一系列属性。 这些属性确定可对服务调用的方法。 例如,当 CanStop 属性设置为 true 时,可以调用服务上的 OnStop 方法。 当 CanPauseAndContinue 属性设置为 true 时,可以调用 OnPauseOnContinue 方法。 在将其中一个属性设置为 true 时,应该替代并定义关联方法的处理进程。

    注意

    服务必须至少替代 OnStartOnStop 才有用。

还可以使用名为 ServiceController 的组件与现有服务进行通信并控制其行为。

请参阅