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

注释

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

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

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

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

定义服务的行为

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

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

注释

这些方法表示服务在其生存期内移动的状态;服务从一种状态转换为下一个状态。 例如,在调用OnContinue之前,您永远不会让服务响应OnStart命令。

有几个其他的属性和方法值得注意。 这些包括:

  • Run 类的 ServiceBase 方法。 这是服务的主要入口点。 使用 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 “与现有服务”通信和控制行为的组件。

另请参阅