1、Windows服务是长时间运行的程序,这些程序执行任务时不与用户交互。这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。这些特性使Windows服务非常适合在服务器上使用,每当需要使用不会影响在同一台计算机上工作的其他用户的功能时也适用。还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务。20.1 什么是Windows服务20.2 创建我的第一个Windows服务20.3 安装和卸载服务20.4 启动和停止服务20.5 Windows服务应用实例:数据库备份Windows服务是可以长时间运行的程序,可以在计算机启动时自动启动,也可以暂停、重新
2、启动或者卸载,并且在执行任务时不显示任何用户界面。3个步骤:设置ServiceName属性;为服务应用程序创建必需的安装程序;重写OnStart和OnStop方法并为其指定代码,以对服务的行为方式进行自定义。Step1:新建一个Windows服务项目。单击菜单栏中的【文件】【新建项目】命令,打开【新建项目】窗口在【模板】列表框中选择【Windows服务】,在【名称】文本框中输入“FirstWinService”。在【解决方案资源管理器】窗口,可以看到一个Service1.vb文件,这是Windows服务的代码文件,我们将其重命名为FirstWinService.vb。Step2:在【属性】窗口
3、中,设置服务的ServiceName属性,如下图。该属性用于对系统标识服务的名称。CanStop:True指示服务将接受停止运行的请求;False指示禁止停止运行服务。CanShutdown:True指示服务希望在运行该服务的计算机关闭时收到通知,以便能够调用OnShutdown过程。CanPauseAndContinue:True指示服务将接受暂停或继续运行的请求;False指示禁止服务暂停运行和继续运行。CanHandlePowerEvent:True指示服务可以处理有关计算机电源状态更改的通知;False指示禁止服务得到有关这些更改的通知。AutoLog:True表示在服务执行操作时将信
4、息项写入应用程序的事件日志;False表示禁用此功能。这些属性用于确定服务的工作机制。默认情况下,AutoLog设置为True。当CanStop或CanPauseAndContinue设置为False时,服务控制管理器会禁用相应的停止、暂停或继续服务的菜单选项。Step3:属性设置完毕后,我们还需要为OnStart和OnStop过程填写所需的处理。由于该服务要实现自定义事件日志的功能,这可以由EventLog组件来实现。在工具箱的【组件】选项卡,将EventLog组件拖到服务设计器中。Step4:编写构造函数以定义一个用户事件日志。可以选择方法声明下拉列表中的New以添加一个空的New方法。下
5、面是构造函数的代码,定义了一个用户事件日志。1 Public Sub New()2 调用基类的构造函数3 MyBase.New()4 InitializeComponent()5 创建一个系统日志源6 If Not System.Diagnostics.EventLog.SourceExists(MySource)Then7 System.Diagnostics.EventLog.CreateEventSource(MySource,_8 MyNewLog)9 End If10 设置EventLog组件的源11 EventLog1.Source=MySource12 设置EventLog组件的
6、日志名称13 EventLog1.Log=MyNewLog14 End SubStep5:重写OnStart方法,定义服务启动时发生的情况。1 Protected Overrides Sub OnStart(ByVal args()As String)2 写入日志,描述信息为“In OnStart”3 EventLog1.WriteEntry(In OnStart)4 End SubStep6:重写OnStop方法,定义服务停止时发生的情况。1 Protected Overrides Sub OnStop()2 写入日志,描述信息为“In OnStop”3 EventLog1.WriteEnt
7、ry(In OnStop.)4 End Sub除此之外,还可以重写OnPause、OnContinue和OnShutdown方法来定义当服务暂停、继续和系统关机时的处理。至此,我们的FirstWinService服务就基本完成了。单击菜单栏中的【生成】【生成解决方案】来生成项目。注意,不要通过按【F5】键来运行项目,因为Windows服务项目不能以这种方式来运行。Windows服务编写完成以后,还需要安装以后才能启动。我们需要为FirstWinService添加一个安装程序,这是必需的。在【解决方案资源管理器】窗口中,右击【FirstWinService.vb】,在打开的右键菜单中单击【视图设
8、计器】,打开视图设计窗口。在该窗口的任意一个空白的地方右击,在打开的右键菜单中单击【添加安装程序】。此时,项目中就添加了一个新类ProjectInstaller和两个安装组件ServiceProcessInstaller和 ServiceInstaller,并且服务的属性值被复制到组件。单击ServiceInstaller1组件,打开其【属性】窗口,验证ServiceName属性的值已为与服务本身的ServiceName属性的值相同,并将StartType属性设置为Automatic。该属性用于确定启动服务的方式,可选值有以下几个。Manual:服务安装后,必须手动启动。Automatic:每
9、次计算机重新启动时,服务都会自动启动。Disabled:服务无法启动。在设计器中单击ServiceProcessInstaller1,打开其【属性】窗口,将Account属性设置为LocalService。该属性用于设置服务运行的安全上下文,可选值有以下几个。User,当服务已安装并且在由网络上的单一用户指定的帐户的上下文中运行时,该类型将使系统要求提供有效的用户名和密码。LocalService,该类型在用作本地计算机上的非特权用户并向任意远程服务器显示匿名凭据的帐户的上下文中运行。LocalSystem,该类型在提供多种本地特权并向任意远程服务器显示计算机凭据的帐户的上下文中运行。Netw
10、orkService,该类型在用作本地计算机上的非特权用户并向任意远程服务器显示计算机凭据的帐户的上下文中运行。在【解决方案资源管理器】窗口中,右击解决方案,在打开的右键菜单中单击【添加】【新建项目】。在打开的【新建项目】窗口中的【项目类型】列表框中选择【安装和部署】项目,在【模板】列表框中选择【安装项目】,在【名称】文本框中输入“MyServiceSetup”,【解决方案】下拉列表框中选择【添入解决方案】。单击【确定】按钮后,安装项目随即添加到当前解决方案中。在【解决方案资源管理器】窗口中,右击【MyServiceSetup】项目,在打开的右键菜单中单击【添加】【项目输出】命令,打开【添加项
11、目输出组】窗口。在【项目】下拉列表框中选择【MyNewService】,在其列表框中选择【主输出】。单击【确定】按钮后,MyNewService 的主输出的项目项被添加到安装项目中。在【解决方案资源管理器】窗口中右击安装项目,在打开的右键菜单中单击【视图】【自定义操作】打开【自定义操作】编辑器。在【自定义操作】编辑器中右击【自定义操作】选项,在打开的右键菜单中单击【添加自定义操作】。之后打开【选择项目中的项】窗口。在【查找范围】下拉列表框中选择【应用程序文件夹】,在其列表框中选择【MyNewService 的主输出(活动)】。单击【确定】按钮后,主输出被添加到自定义操作的所有4个节点,即安装、
12、提交、回滚和卸载。在【解决方案资源管理器】窗口中,右击【MyServiceSetup】项目,在打开的右键菜单中单击【生成】命令,以生成该项目。至此,Windows服务的安装程序就完成了。右击【解决方案资源管理器】窗口中的【MyServiceSetup】安装项目,在打开的右键菜单中单击【安装】,打开安装向导窗口。单击【下一步】,选择安装文件夹。单击【下一步】,确认安装。单击【下一步】,开始安装过程。安装完成后,单击【关闭】按钮。此时,打开【服务器资源管理器】窗口,展开服务器节点,在服务中即可看到FirstWinService服务。也可以右击【我的电脑】,在打开的右键菜单中单击【管理】,打开【计算
13、机管理】窗口,在左侧列表框中单击【服务和应用程序】下的【服务】,也可以看到FirstWinService服务。一种是打开【控制面板】,双击【添加或删除程序】,找到该安装文件,单击【删除】按钮。另一种方法是找到安装项目的msi文件,该文件位于安装项目的Release文件夹下。服务安装以后,可以手动的启动或者停止。在【计算机管理】窗口,右击该服务,在打开的右键菜单中单击【启动】或者【停止】即可。由于FirstWinService在启动和停止的时候均会写入日志,因此可以查看服务的事件日志输出。在【计算机管理】窗口中,在左侧列表框中单击【事件查看器】选项,即可看到MyNewLog,这是我们自定义的日志
14、源。打开MyNewLog,即可看到写入的日志信息。右击该日志信息,在打开的右键菜单中单击【属性】,可以看到该日志信息的描述。应用背景:在服务器上常会有一些重要的数据库,为了防止数据丢失或者因为程序崩溃或其他异常情况导致数据损坏,可以定期备份数据库中的数据。本节就来实现这个定期备份数据库的Windows服务。首先新建一个Windows服务应用工程,并将计时器添加到工程中来,在服务的构造函数中初始化计时器。【代码演示】下面代码是服务的构造函数,完成计时器的初始化。1 Public Sub New()2 MyBase.New()3 此调用是Windows窗体设计器所必需的4 InitializeCo
15、mponent()5 在InitializeComponent()调用之后添加任何初始化6 每一分钟就执行备份7 Timer1.Interval=600008 Timer1.Enabled=False9 End Sub在服务启动和停止时分别启动计时器和停止计时器。【代码演示】下面代码重写OnStart方法和OnStop方法,实现计时器的启动和停止。1 Protected Overrides Sub OnStart(ByVal args()As String)2 请在此处添加代码以启动您的服务。此方法应完成设置工作,3 以使您的服务开始工作。4 Timer1.Start()5 End Sub6
16、7 Protected Overrides Sub OnStop()8 在此处添加代码以执行任何必要的拆解操作,从而停止您的服务。9 Timer1.Stop()10 End Sub该服务的重点代码在于计时器每隔一定的时间间隔(本例中是一分钟)就执行数据库备份的工作。下面代码是计时器的Elapsed事件过程,实现数据库的备份。1 Private Sub Timer1_Elapsed(ByVal sender As System.Object,ByVal e As System.Timers.ElapsedEventArgs)Handles Timer1.Elapsed2 Dim connStri
17、ng As String=Data Source=.;Initial Catalog=VBNET2008;Integrated Security=True;3 Dim conn As SqlConnection=New SqlConnection()4 conn.ConnectionString=connString5 执行备份的语句6 Dim sql As String=BACKUP DATABASE xiaoqu TO DISK=C:VBNET2008.bak WITH FORMAT7 Dim command As SqlCommand=New SqlCommand(sql)8 command.Connection=conn9 Try10 开始执行11 conn.Open()12 command.ExecuteNonQuery()13 Catch ex As SqlException14 Finally15 conn.Close()16 End Try17 End Sub