我们通过 Windows 服务可以创建在 Windows 会话中长时间运行的应用程序。服务可以跟随计算机一起启动,并且可以暂停、停止和重启。Windows 服务和 Windows Form 程序最大的不同点是 Windows 服务没有任何用户界面。Windows 服务一般用于后台处理数据,例如批量信息发送、定时执行任务、进程监视等方面。并且还可以针对不同的登录账户执行不同的服务操作等。对于创建 Windows 服务没有哪个开发平台比 .NET Framework 更加便捷,尤其是利用 C# 开发 Windows 服务对于程序员来说说简单的飞起。 Windows 服务虽然开发很简单但是注意事项太多了,多说开发人员在开发的时候往往会忽略一些东西,那么这篇文章就带领读者详细讲解一下 Windows 服务。
Windows 服务体系结构包含三个模块:服务模块、服务控制模块和服务配置模块。下面我们来详细讲解一下这三个模块。
- 服务模块
Windows 服务的核心模块,主要包含三个部分:入口函数 、Service 函数和处理程序。它们都由 SCM (服务控制器)控制,SCM 可以说是 Windows 服务核心的核心。它是操作系统的一个组成部分,用于和 Windows 服务进行通信,操作系统依靠 SCM 控制 Windows 服务进程的启动、停止和交互。
- 入口函数,程序的入口,在这里可以注册多个服务函数;
- Service 函数,它包含服务的实际功能。SCM 为每个需要启动的服务调用 Service 函数;
- 处理程序,响应来自 SCM 的事件,所响应的事件包括:停止、暂停、重启等。
2.服务控制模块
负责把控制请求(如:启动、停止、暂停和重启)发送给服务。服务控制模块独立于 SCM 和服务本身。它的主要作用有两个:
- 询问服务的状态并实现响应自定义控制代码的处理程序;
- 向服务发送控制代码并处理程序应该响应发送的事件。
3.服务配置模块
负责安装服务,它会把服务复制到文件系统中,以及把服务的信息写到注册表中。其中注册表中的信息主要用于 SCM 开始和启动服务。这里需要注意:
- 服务必须在注册表中配置不然服务将无法启动,这是因为注册表包含服务的启动类型;
- 我们必须设置服务的用户、依赖关系。这些工作都是在服务配置程序中进行的。
.NET 中和服务相关的类都位于命名空间 System.ServiceProcess 中。它包含了四个类:ServiceBase 、 ServiceController 、ServiceProcessInstaller 和 ServiceInstaller。ServiceBase 类是服务的基类,它定义了一些可被重载的函数,通过重载这些函数服务控制管理器就可以控制 Windows 服务程序。常用的可重载的函数包括:OnStart()、OnStop()、OnPause() 以及 OnContinue() 。如果涉及特殊用途那么可以重载 OnCustomCommand() 函数来完成。ServiceBase 类还为我们提供了很多属性,常用的属性包括:ServiceName 属性(指定 Windows 服务名称)、 CanPauseAndContinue属性(是否允许暂停并恢复服务) 和 CanStop 属性(是否允许停止服务)。 ServiceController 使我们可以连接到正在运行或已停止的服务。通过它可以更改服务状态并获取有关服务的信息。创建服务控制器类的实例时,我们设置与安装的 Windows Service 交互属性。ServiceController 主要用于管理 SCM 的工具。
ServiceProcessInstaller 和 ServiceInstaller 主要用于服务的安装配置,它们执行特定于其所关联服务的操作。安装工具用来将与服务关联的注册表值写入注册表项。
具用来将与服务关联的注册表值写入注册表项。