.NET自动服务程序—C#(一)
追风 (VisualSW)
应用程序开发中,常常需要实现这样一种功能:让服务器在每天的特定时刻运行固定的程序(或者实现固定的操作),比如让系统在每天的 2 : 00 备份数据库数据。要实现这样的功能,我们可以使用 Windows 服务( Windows service )。
Windows service 是一种系统自动的、无人值守的程序(仅存在于 Windows NT 、 2000 和 XP 操作系统中),它能够在系统启动时开始运行。用户可以通过 Service Control Manager (SCM) applet 或者一些特殊的 service-control 应用来访问 Windows service ,使服务在没有用户登录到系统之前执行。
在 .NET 出现以前,编写 Windows 服务是 VC++ 、 Delphi 才能办到的事情,
VB 必须使用第三方控件才可以办到,而且编写起来特别的复杂。使用 Microsoft®.NET Framework ,我们可通过创建作为服务安装的应用程序来方便地创建 Windows 服务。
设计:
一个 Windows 服务程序,按照配置文件中的配置,在指定时刻运行指定程序。
流程:
启动服务 à 读取配置文件 à 启动定时器
定时器定时触发 ( 比如每隔 30 秒 ) à 循环需要运行组件时间 à 时间到 à 运行指定程序
编写:
创建一个 Windows Service

将 Server1.cs 更名为 SchedulerServer .cs ,
双击 SchedulerServer.cs 打开设计页面,从工具栏的组件中拖 Timer 控件。

更名为 SchedulerTimer ,并设置 Enabled 为 flase 。
注意必须是 Components 里面的 Timer 控件, Windows Forms 里面的 Timer 控件不行。
F7 浏览代码可以看到如下代码
服务器启动的时候运行:
///
1<summary>
2
3/// Set things in motion so your service can do its work.
4
5/// </summary>
protected override void OnStart( string [] args)
{
// TODO: Add code here to start your service.
}
服务停止的时候运行:
///
1<summary>
2
3/// Stop this service.
4
5/// </summary>
protected override void OnStop()
{
// TODO: Add code here to perform any tear-down necessary to stop your service.
}
添加写日志函数,用来记录服务的日志:
public static void WriteLog( string strLog)
{
string strPath;
strPath=System.Environment.SystemDirectory;
strPath+=@"\SchedulerServer.txt";
FileStream fs = new FileStream(strPath,FileMode.OpenOrCreate,FileAccess.Write);
StreamWriter m_streamWriter = new StreamWriter(fs);
m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);
m_streamWriter.WriteLine(strLog);
m_streamWriter.Flush();
m_streamWriter.Close();
fs.Close();
}
自动服务配置文件
配置文件保存在系统目录, Windows 2000 为 WinNT\System32 ,文件名为 SchedulerServer.xml ,存储了自动服务的所有配置信息,下面我们来看 SchedulerServer.xml 的格式:
< SchedulerServer >
< AutoServer >
< FilePath > C:\AutoBackup.dll < RunTime > 02:00 < AutoServer >
< FilePath > D:\AutoMail.dll < RunTime > 03:00 FilePath 设置需要运行的组件的路径
RunTime 设置需要运行的时间
如果有多个程序需要运行,只需要添加
1<autoserver> 节点
2
3程序中添加读取配置文件函数:
4
5private bool ReadConf()
6
7{
8
9try
10
11{
12
13string strPath;
14
15XmlDocument xmldoc= new XmlDocument();
16
17XmlNodeList xmlnd;
18
19strPath=System.Environment.SystemDirectory+@"\SchedulerServer.xml";
20
21xmldoc.Load(strPath);
22
23xmlnd=xmldoc.SelectNodes("SchedulerServer/AutoServer");
24
25arrConf= new String[2,xmlnd.Count];
26
27for ( int i=0;i<xmlnd.Count;i++)
28
29{
30
31arrConf[0,i]=xmlnd[i].SelectSingleNode("FilePath").InnerXml.Trim();
32
33arrConf[1,i]=xmlnd[i].SelectSingleNode("RunTime").InnerXml.Trim();
34
35}
36
37return true ;
38
39}
40
41catch (Exception e)
42
43{
44
45WriteLog(DateTime.Now.ToString());
46
47WriteLog("Read Configuration Error:");
48
49WriteLog(e.ToString());
50
51return false ;
52
53}
54
55}</autoserver>