100165800.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 504 行 · 第 1/3 页
HTM
504 行
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>
32.4.3 Windows服务项目
</title></head>
<body>
<div class="area">
<div class="col1">
<div class="lineBlue">
</div>
<!-- title -->
<div class="arcTitle">
<h1>
<a href="../16">
C#高级编程(第3版)【全文连载】
</a>
</h1>
<div style="text-align: center; font-size: 15px">
<a href="100165800.htm">
32.4.3 Windows服务项目
</a>
</div>
<div style="text-align: center; font-size: 15px">
<a class="url" href="../../default.htm">http://book.csdn.net/</a>
2006-10-13 14:41:00
</div>
<div style="margin: 0px auto; width: 700px; border: solid 1px #0b5f98;">
<div style="float: left; width: 16px; background-color: #0b5f98; color: White; padding: 1px;">
图书导读
</div>
<div style="float: right; width: 670px; text-align: left; line-height: 16pt; padding-left: 2px">
<!--导读-->
<h1 id="divCurrentNode" style="color: #b83507; width: 100%; text-align: left; font-size: 12px; padding-left: 2px">当前章节:<a href='100165800.htm'><font color='red'>32.4.3 Windows服务项目</font></a></h1>
<div id="divRelateNode" style="padding-left: 2px">
<div style='float:left;width:49%'>·<a href='100165797.htm'>32.4 创建Windows服务</a></div><div style='float:right;width:49%'>·<a href='100165798.htm'>32.4.1 使用套接字的类库</a></div><div style='float:left;width:49%'>·<a href='100165799.htm'>32.4.2 TcpClient示例</a></div><div style='float:right;width:49%'>·<a href='100165801.htm'>32.4.4 线程和服务</a></div><div style='float:left;width:49%'>·<a href='100165802.htm'>32.4.5 服务的安装</a></div><div style='float:right;width:49%'>·<a href='100165803.htm'>32.4.6 安装程序</a></div></div>
</div>
</div>
</div>
<!-- main -->
<div id="main">
<div id="text"> <link href="css.css" rel="stylesheet" type="text/css" /><h3 style='margin-top:8.15pt;margin-right:0cm;FTEL:8.15pt;margin-left:
0cm'><a FTEL="_Toc507815580"><span lang=EN-US style='color:black'>32.4.3
Windows</span></a><span style='font-family:黑体;color:black'>服务项目</span></h3>
<p class=MsoNormal><span style='font-family:宋体'>使用</span><span lang=EN-US>C#
Windows</span><span style='font-family:宋体'>服务的新项目创建向导可以创建</span><span
lang=EN-US>Windows</span><span style='font-family:宋体'>服务,该项目命名为</span><span
lang=EN-US>QuoteService</span><span style='font-family:宋体'>,其窗口如图</span><span
lang=EN-US>32-7</span><span style='font-family:宋体'>所示。注意,在选择项目时不要误选为</span><span
lang=EN-US>Web</span><span style='font-family:宋体'>服务项目。</span></p>
<p align=center><span lang=EN-US><img width=366 height=251
src="32/image007.jpg"></span></p>
<p align=center style='FTEL:8.15pt'><span style='font-family:宋体;color:black'>图</span><span
lang=EN-US style='color:black'> 32-7</span></p>
<p class=MsoNormal><span style='font-family:宋体;color:black'>在单击</span><span
lang=EN-US style='color:black'>OK</span><span style='font-family:宋体;color:black'>按钮开始创建</span><span
lang=EN-US style='color:black'>Windows</span><span style='font-family:宋体;
color:black'>服务应用程序之后,就会出现一个外表与</span><span lang=EN-US style='color:black'>Windows
Forms</span><span style='font-family:宋体;color:black'>应用程序相似的设计器,但是不能在其中插入</span><span
lang=EN-US style='color:black'>Windows Forms</span><span style='font-family:
宋体;color:black'>组件,因为应用程序不能直接在屏幕上显示任何信息,本章的后面将使用设计器添加性能计数器和事件日志等其他组件。</span></p>
<p class=MsoNormal><span style='font-family:宋体;color:black'>选择这个服务的属性,可以打开如图</span><span
lang=EN-US style='color:black'>32-8</span><span style='font-family:宋体;
color:black'>所示的属性编辑窗口。</span></p>
<p align=center><span lang=EN-US><img width=186 height=255
src="32/image008.jpg"></span></p>
<p align=center style='FTEL:8.15pt'><span style='font-family:宋体;color:black'>图</span><span
lang=EN-US style='color:black'> 32-8</span></p>
<p class=MsoNormal><span style='font-family:宋体;color:black'>使用服务属性可以配置如下值:</span></p>
<p class=1 style='margin-left:37.55pt;FTEL:-16.1pt'><span lang=EN-US>●<span
style='font:7.0pt "Times New Roman"'> </span></span><span
lang=EN-US>AutoLog</span><span style='font-family:宋体'>指定启动和停止服务的事件自动写到日志文件中。</span></p>
<p class=1 style='margin-left:37.55pt;FTEL:-16.1pt'><span lang=EN-US
style='color:black'>●<span style='font:7.0pt "Times New Roman"'>
</span></span><span lang=EN-US style='color:black'>CanPauseAndContinue</span><span
style='font-family:宋体;color:black'>、</span><span lang=EN-US style='color:black'>CanShutdown</span><span
style='font-family:宋体;color:black'>和</span><span lang=EN-US style='color:black'>
CanStop</span><span style='font-family:宋体;color:black'>指定服务可以处理具体的暂停、继续、关闭和停止服务的请求。</span></p>
<p class=1 style='margin-left:37.55pt;FTEL:-16.1pt'><span lang=EN-US
style='color:black'>●<span style='font:7.0pt "Times New Roman"'>
</span></span><span lang=EN-US style='color:black'>ServiceName</span><span
style='font-family:宋体;color:black'>是写到注册表中的服务名称,使用这个名称可以控制服务。</span></p>
<p class=1 style='margin-left:37.55pt;FTEL:-16.1pt'><span lang=EN-US
style='color:black'>●<span style='font:7.0pt "Times New Roman"'>
</span></span><span lang=EN-US style='color:black'>CanHandlePowerEvent</span><span
style='font-family:宋体;color:black'>选项对运行在膝上计算机的服务有效。如果启用这个选项,服务就可以响应低电源事件,改变服务的操作方式。</span></p>
<p class=a3 style='margin-top:8.15pt;FTEL:21.45pt'><span
style='font-family:黑体'>提示:</span></p>
<p class=a1 style='FTEL:8.15pt;FTEL:21.45pt'><span
style='font-family:楷体_GB2312'>不管项目的名称是什么,默认的服务名称都是</span><span lang=EN-US>WinService1</span><span
style='font-family:楷体_GB2312'>。可以只安装一个</span><span lang=EN-US>WinService1</span><span
style='font-family:楷体_GB2312'>服务。如果在测试过程中出现了安装错误,有可能已经安装了</span><span
lang=EN-US>WinService1</span><span style='font-family:楷体_GB2312'>服务。因此,在服务开发的初始阶段,一定要用属性编辑器把服务的名称改为比较适当的名称。</span></p>
<p class=MsoNormal><span style='font-family:宋体'>使用属性编辑器改变上述属性,在</span><span
lang=EN-US>InitalizeComponent()</span><span style='font-family:宋体'>方法中设置</span><span
lang=EN-US>ServiceBase</span><span style='font-family:宋体'>派生类的值。</span><span
lang=EN-US>Windows Forms</span><span style='font-family:宋体'>应用程序中也使用</span><span
lang=EN-US>InitalizeComponent()</span><span style='font-family:宋体'>方法,对于服务而言,这个方法的使用方式与</span><span
lang=EN-US>Windows Forms</span><span style='font-family:宋体'>应用程序相似。</span></p>
<p class=MsoNormal><span style='font-family:宋体'>向导将生成代码,但是我们将把文件名改为</span><span
lang=EN-US>QuoteService.cs</span><span style='font-family:宋体'>,把命名空间的名称改为</span><span
lang=EN-US>Wrox.ProCSharp.WinServices</span><span style='font-family:宋体'>,并把类名改为</span><span
lang=EN-US>QuoteService</span><span style='font-family:宋体'>。后面将详细讨论这些代码。</span></p>
<h4 style='FTEL:21.45pt'><span lang=EN-US>1. ServiceBase</span><span
style='font-family:黑体'>类</span></h4>
<p class=MsoNormal><span lang=EN-US>ServiceBase</span><span style='font-family:
宋体'>类是所有</span><span lang=EN-US>.NET</span><span style='font-family:宋体'>服务的基类。</span><span
lang=EN-US>QuoteService</span><span style='font-family:宋体'>类就是从</span><span
lang=EN-US>ServiceBase</span><span style='font-family:宋体'>类派生出来的;</span><span
lang=EN-US>QuoteService</span><span style='font-family:宋体'>类使用一个未标注的帮助类</span><span
lang=EN-US>System.ServiceProcess.NativeMethods</span><span style='font-family:
宋体'>与</span><span lang=EN-US>SCM</span><span style='font-family:宋体'>进行通信,</span><span
lang=EN-US>System.ServiceProcess.NativeMethods</span><span style='font-family:
宋体'>是</span><span lang=EN-US>Win32 API</span><span style='font-family:宋体'>调用的包装类。</span><span
lang=EN-US>ServiceBase</span><span style='font-family:宋体'>类是私有的,因此,不能在这里的代码中使用它。</span></p>
<p class=MsoNormal><span style='font-family:宋体;color:black'>图</span><span
lang=EN-US style='color:black'>32-9</span><span style='font-family:宋体;
color:black'>显示了</span><span lang=EN-US style='color:black'>SCM</span><span
style='font-family:宋体;color:black'>、</span><span lang=EN-US style='color:black'>QuoteService</span><span
style='font-family:宋体;color:black'>类和</span><span lang=EN-US style='color:black'>System.ServiceProcess</span><span
style='font-family:宋体;color:black'>命名空间中的类是怎样相互作用的。在这个图中,垂直方向为对象的生命线,水平方向为通信情况,通信是按照时间的先后顺序而进行的。</span></p>
<p class=MsoNormal><span lang=EN-US>SCM</span><span style='font-family:宋体'>启动应该启动的服务进程。首先调用</span><span
lang=EN-US>Main()</span><span style='font-family:宋体'>方法。在示例服务的</span><span
lang=EN-US>Main()</span><span style='font-family:宋体'>方法中,调用</span><span
lang=EN-US>ServiceBase</span><span style='font-family:宋体'>基类的</span><span
lang=EN-US>Run()</span><span style='font-family:宋体'>方法。</span><span lang=EN-US>Run()</span><span
style='font-family:宋体'>使用</span><span lang=EN-US>SCM</span><span
style='font-family:宋体'>中的</span><span lang=EN-US>NativeMethods.StartServiceCtrl
Dispatcher()</span><span style='font-family:宋体'>注册</span><span lang=EN-US>ServiceMainCallback()</span><span
style='font-family:宋体'>方法,并把记录写到事件日志中。</span></p>
<p class=MsoNormal><span style='font-family:宋体'>接下来,</span><span lang=EN-US>SCM</span><span
style='font-family:宋体'>在服务程序中调用已注册的</span><span lang=EN-US>ServiceMainCallback()</span><span
style='font-family:宋体'>方法。</span><span lang=EN-US>ServiceMainCallback()</span><span
style='font-family:宋体'>本身使用</span><span lang=EN-US>NativeMethods.RegisterServiceCtrlHandler[Ex]()</span><span
style='font-family:宋体'>在</span><span lang=EN-US>SCM</span><span
style='font-family:宋体'>中注册处理程序,并在</span><span lang=EN-US>SCM</span><span
style='font-family:宋体'>中设置服务的状态。之后调用</span><span lang=EN-US>OnStart()</span><span
style='font-family:宋体'>方法。在</span><span lang=EN-US>OnStart()</span><span
style='font-family:宋体'>中,必须执行启动代码。如果</span><span lang=EN-US>OnStart()</span><span
style='font-family:宋体'>执行成功,就把字符串</span><span lang=EN-US>Service Started
Sucessful</span><span style='font-family:宋体'>写到事件日志中。</span></p>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?