Windows 服务应用程序介绍
Microsoft Windows 服务(即以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序这些服务可以在计算机启动时自动启动可以暂停和重新启动而且不显示任何用户界面这使服务非常适合在服务器上使用或任何时候为了不影响在同一台计算机上工作的其他用户需要长时间运行功能时使用还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务
创建 Windows 服务
当创建服务时可以使用称作 Windows 服务的 Visual Studio NET 项目模板此模板引用适当的类和命名空间设置从服务基类的继承并重写您可能要重写的几种方法从而自动为您完成大部分工作
若要创建功能性服务必须至少
设置 ServiceName 属性
为服务应用程序创建必需的安装程序
重写 OnStart 和 OnStop 方法并为其指定代码以自定义服务的行为方式
在将安装程序添加到应用程序之后下一步是创建安装项目该项目将安装已编译的项目文件并运行安装服务所需的安装程序若要创建完整的安装项目您必须将服务项目的输出添加到该安装项目然后添加自定义操作以安装您的服务
创建一个 Windows 服务项目
在属性窗口中设置服务的 ServiceName 属性 (注意 ServiceName 属性的值必须始终与安装程序类中记录的名称匹配如果更改此属性还必须更新安装程序类中的 ServiceName 属性)
设置下列所有属性以确定服务的工作机制 属性 设置
CanStop True 表示服务将接受停止运行的请求false 表示禁止服务停止
CanShutDown True 表示服务希望在运行它的计算机关闭时收到通知以便能够调用 OnShutDown 过程
CanPauseAndContinue True 表示服务将接受暂停或继续运行的请求false 表示禁止服务暂停和继续
CanHandlePowerEvent True 表示该服务可以处理有关计算机电源状态更改的通知false 表示禁止服务得到有关这些更改的通知
AutoLog True 表示在服务执行操作时将信息项写入应用程序的事件日志false 表示禁用此功能(注意 默认为 true)
注意 当 CanStop 或 CanPauseandContinue 设置为 false 时服务控制管理器将禁用停止暂停或继续服务的相应菜单选项
访问代码编辑器并为 OnStart 和 OnStop 过程填写所需的处理
重写其他所有要为其定义功能的方法
添加服务应用程序所必需的安装程序
通过从生成菜单中选择生成解决方案来生成项目 (注意 不要通过按 F 键来运行项目不能以这种方式运行服务项目)
实例
新建一个名为MyService的Windows服务项目将Servicecs及代码里的类名改为你想要的名字我这里统一用MyService
using SystemThreading;
一个后台服务线程private Thread backThread=null;
在构造函数里实例化线程thisbackThread=new Thread(new ThreadStart(thisRunning));
在类里添加private void Running(){}方法一般要让线程一直处于运行状态来处理你给它安排的工作例如根据消息队列里的消息执行下载任务下载文件
private void Running()
{
while(true)
{
//你的处理
ThreadSleep(*);//例如让线程休眠秒
}
}
重写线程的控制函数
protected override void OnStart(string[] args)
{
thisbackThreadStart();
}
protected override void OnStop()
{
thisbackThreadAbort();
}
protected override void OnPause()
{
thisbackThreadSuspend();
}
protected override void OnContinue()
{
thisbackThreadResume();
}
同时你也可以根据需要按照上面表格所列的属性进行设置
在该项目上点右键选择添加-添加类-安装程序类取名Installcs
在Installcs的视图设计器里为它添加ServiceInstall和ServiceProcessInstall控件可以为这个控件设置属性例如可以在ServiceInstall的ServiceDependedOn属性里设置服务依赖
生成解决方案下面介绍如何安装服务
安装和卸载服务
手动安装服务
访问项目中的已编译可执行文件所在的目录
用项目的输出作为参数从命令行运行 InstallUtilexe在命令行中输入下列代码
installutil yourprojectexe
手动卸载服务
用项目的输出作为参数从命令行运行 InstallUtilexe在命令行中输入下列代码
installutil /u yourprojectexe
调试 Windows 服务应用程序
由于服务必须从服务控制管理器的上下文中运行而不是从 Visual Studio NET 中运行因此调试服务不像调试其他 Visual Studio 应用程序类型那样简单若要调试服务必须首先启动服务然后将一个调试器附加到正在运行服务的进程中然后可以使用 Visual Studio 的所有标准调试功能来调试应用程序
警告 除非知道进程是什么并且知道附加到进程或可能会取消进程所带来的后果否则不要附加到进程例如如果附加到 WinLogon 进程然后停止调试系统就会暂停因为没有 WinLogon系统无法运行
只能将调试器附加到正在运行的服务附加进程会中断服务的当前运行它并不真正终止或暂停服务的处理也就是说如果开始调试时服务正在运行则在进行调试时该服务从技术上说仍处于已启动状态但它的处理已挂起
附加到服务的进程使您能够调试大多数服务代码但并非全部例如由于服务已经启动因此不能用这种方法调试服务的 OnStart 方法中的代码或调试用于加载服务的 Main 方法中的代码解决此问题的一个方法是在唯一作用是帮助调试的服务应用程序中创建一个临时服务可以将两个服务都安装上然后启动此虚拟服务加载服务进程临时服务启动了进程后就可以使用 Visual Studio NET 中的调试菜单来附加到服务进程
当附加该进程之后可以设置断点并使用这些断点来调试代码当退出用于附加到该进程的对话框时实际上已处于调试模式您可以使用服务控制管理器开始停止暂停和继续您的服务因此命中已设置的断点调试成功后移除此虚拟服务
注意 调试 OnStart 方法可能比较困难因为 Windows 服务管理器将所有尝试启动服务的时间限制在 秒内当调试 Windows 服务应用程序时服务与Windows 服务管理器进行交互服务管理器通过调用 OnStart 方法启动服务然后花 秒时间等待 OnStart 方法返回如果在这段时间内方法没有返回管理器将显示一个服务无法启动的错误如果在 OnStart 方法中放置一个断点并且在 秒内不通过该断点则管理器不会启动服务
调试服务
安装您的服务
可从服务控制管理器服务器资源管理器或代码启动服务
在 Visual Studio 中从调试菜单中选择进程 出现进程对话框
单击显示系统进程
在可用进程区域内单击服务的进程然后单击附加 (提示 此进程将与服务的可执行文件同名)出现附加到进程对话框
选择任意适当选项然后单击确定关闭对话框 (注意 您现在已处于调试模式)
设置要在代码中使用的任意断点
访问服务控制管理器并操纵您的服务并发送停止暂停和继续命令以命中您的断点