100165800.htm

来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 504 行 · 第 1/3 页

HTM
504
字号
<p class=MsoNormal><span style='font-family:宋体'>处理程序是在</span><span lang=EN-US>ServiceCommandCallback()</span><span
style='font-family:宋体'>方法中执行的。当改变了对服务的请求时,</span><span lang=EN-US>SCM</span><span
style='font-family:宋体'>就调用</span><span lang=EN-US>ServiceCommandCallback()</span><span
style='font-family:宋体'>方法。</span><span lang=EN-US>ServiceCommandCallback()</span><span
style='font-family:宋体'>方法再把请求发送给</span><span lang=EN-US>OnPause()</span><span
style='font-family:宋体'>、</span><span lang=EN-US>OnContinue()</span><span
style='font-family:宋体'>、</span><span lang=EN-US>OnStop()</span><span
style='font-family:宋体'>、</span><span lang=EN-US>OnCustomCommand()</span><span
style='font-family:宋体'>和</span><span lang=EN-US>OnPowerEvent()</span><span
style='font-family:宋体'>。</span></p>

<p align=center><span lang=EN-US style='color:black'><img width=447 height=316
src="32/image009.gif"></span></p>

<p align=center style='FTEL:4.9pt'><span style='font-family:宋体;color:black'>图</span><span
lang=EN-US style='color:black'>&nbsp; 32-9</span></p>

<h4 style='FTEL:21.45pt'><span lang=EN-US>2. </span><span
style='font-family:黑体'>主函数</span></h4>

<p class=MsoNormal><span style='font-family:宋体'>现在讨论服务进程中由应用程序向导生成的主函数。在主函数中,声明了一个元素为</span><span
lang=EN-US>ServiceBase</span><span style='font-family:宋体'>类的数组</span><span
lang=EN-US>ServicesToRun</span><span style='font-family:宋体'>。创建</span><span
lang=EN-US>QuoteService</span><span style='font-family:宋体'>类的一个实例,并作为</span><span
lang=EN-US>ServicesToRun</span><span style='font-family:宋体'>数组的第一个元素。如果在这个服务进程中要运行多个服务,就需要把具体服务类的多个实例添加到数组中。然后把</span><span
lang=EN-US>ServicesToRun</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>ServiceBase</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></p>

<p class=MsoNormal><span style='font-family:宋体'>下面是自动生成的代码:</span></p>

<p class=2 style='margin-top:4.9pt;margin-right:0cm;FTEL:0cm;
margin-left:21.45pt;FTEL:.0001pt;FTEL:18.45pt'><span
lang=EN-US style='color:black'>&nbsp;&nbsp;&nbsp;&nbsp; </span><span
lang=EN-US>&nbsp;// The main entry point for the process</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
static void Main()</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
{</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
System.ServiceProcess.ServiceBase[] ServicesToRun;</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;
</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// More than one user Service may run within the same process. To</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// add another service to this process, change the following line</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
// to create a second service object. For example,</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
//</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
//&nbsp;&nbsp; ServicesToRun = New System.ServiceProcess.ServiceBase[] </span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
//&nbsp;&nbsp; {</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new WinService1(), new MySecondUserService()</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
//&nbsp;&nbsp; };</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
//</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
ServicesToRun = new System.ServiceProcess.ServiceBase[] </span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
new QuoteService() </span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
};</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
System.ServiceProcess.ServiceBase.Run(ServicesToRun);</span></p>

<p class=2 style='margin-top:0cm;margin-right:0cm;FTEL:8.15pt;
margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</span></p>

<p class=MsoNormal><span style='font-family:宋体'>如果进程中只有一个服务,就可以删除数组。</span><span
lang=EN-US>Run()</span><span style='font-family:宋体'>方法接收从</span><span
lang=EN-US>ServiceBase</span><span style='font-family:宋体'>派生出来的单个对象,因此</span><span
lang=EN-US>Main()</span><span style='font-family:宋体'>方法可以简化为:</span></p>

<p class=2 style='margin-top:8.15pt;margin-right:0cm;FTEL:8.15pt;
margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>System.ServiceProcess.ServiceBase.Run(new
QuoteService());</span></p>

<p class=MsoNormal><span style='font-family:宋体'>如果有多个服务,例如</span><span
lang=EN-US>Windows</span><span style='font-family:宋体'>程序</span><span
lang=EN-US>Services.exe</span><span style='font-family:宋体'>就包含多个服务,并且需要那些服务有共享的初始化,则共享的初始化必须在</span><span
lang=EN-US>Run()</span><span style='font-family:宋体'>方法运行之前完成。因为主线程处于停滞状态,直到服务进程停止为止,以后的指令在服务结束之前就不能执行。</span></p>

<p class=MsoNormal><span style='font-family:宋体;color:black'>初始化花费的时间不应该太长,通常不应该超过</span><span
lang=EN-US style='color:black'>30</span><span style='font-family:宋体;color:black'>秒。如果执行初始化代码所花费的时间过多,则服务控制管理器就认为服务启动失败了。初始化时间不应该超过</span><span
lang=EN-US style='color:black'>30</span><span style='font-family:宋体;color:black'>秒,必须是针对速度最慢的机器而言。如果初始化的时间过长,就应该在另一线程中进行初始化,以便主线程及时地调用</span><span
lang=EN-US style='color:black'>Run()</span><span style='font-family:宋体;
color:black'>。然后,事件对象可以用信号通知线程已经完成了它的工作。</span></p>

<h4 style='FTEL:21.45pt'><span lang=EN-US>3. </span><span
style='font-family:黑体'>服务的启动</span></h4>

<p class=MsoNormal><span style='font-family:宋体'>在服务启动时,调用</span><span
lang=EN-US>OnStart()</span><span style='font-family:宋体'>方法。这时,可以启动套接字服务器。为了使用</span><span
lang=EN-US>QuoteServer</span><span style='font-family:宋体'>,必须引用</span><span
lang=EN-US>QuoteServer.dll</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>(</span><span style='font-family:宋体'>即</span><span lang=EN-US>ServiceBase</span><span
style='font-family:宋体'>类的</span><span lang=EN-US>ServiceMainCallback()</span><span
style='font-family:宋体'>方法</span><span lang=EN-US>)</span><span
style='font-family:宋体'>。</span><span lang=EN-US>ServiceBase</span><span
style='font-family:宋体'>类注册处理程序,并在调用</span><span lang=EN-US>OnStart()</span><span
style='font-family:宋体'>之后把服务成功启动的消息通知给</span><span lang=EN-US>SCM</span><span
style='font-family:宋体'>:</span></p>

<p class=a6 style='margin-top:8.15pt;margin-right:0cm;FTEL:0cm;
margin-left:21.45pt;FTEL:.0001pt;FTEL:18.45pt'><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected override void
OnStart(string[] args)</span></p>

<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
{</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
quoteServer = new QuoteServer(@&quot;c:\ProCSharp\Services\quotes.txt&quot;, </span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;5678);</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;quoteServer.Start();</span></p>

<p class=a6 style='margin-top:0cm;margin-right:0cm;FTEL:8.15pt;
margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}&nbsp; </span></p>

<p class=MsoNormal><span lang=EN-US>quoteServer</span><span style='font-family:
宋体'>变量声明为类中的私有成员:</span></p>

<p class=a6 style='margin-top:8.15pt;margin-right:0cm;FTEL:0cm;
margin-left:21.45pt;FTEL:.0001pt;FTEL:18.45pt'><span
lang=EN-US>namespace Wrox.ProCSharp.WinServices</span></p>

<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>{</span></p>

<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;
public class QuoteService : System.ServiceProcess.ServiceBase</span></p>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?