Windows服务二:测试新建的服务、调试Windows服务
一、测试Windows服务
为了使Windows服务程序能够正常运行,我们需要像创建一般应用程序那样为它创建一个程序的入口点。像其他应用程序一样,Windows服务也是在Program.cs的Main()函数中完成这个操作。首先我们在Main()函数中创建一个Windows服务的实例,该实例应该是ServiceBase类的某个子类的对象,然后我们调用由基类ServiceBase类定义的一个Run()方法。然而调用Run()方法并不意味着就开始了Windows服务程序,必须要等到该对象的OnStart()方法被调用时服务才算真正开始运行。如果你想在一个Windows服务程序中同时启动多个服务,那么只要在Main()函数中定义多个ServiceBase类的子类的实例对象就可以了,方法就是创建一个ServiceBase类的数组对象。
1 namespace WindowsServiceDemo 2 { 3 static class Program 4 { 5 /// <summary> 6 /// 应用程序的主入口点。 7 /// </summary> 8 static void Main() 9 { 10 ServiceBase[] ServicesToRun; 11 ServicesToRun = new ServiceBase[] 12 { 13 //服务1 14 new MyService(), 15 //服务2 16 new Service1() 17 }; 18 ServiceBase.Run(ServicesToRun); 19 } 20 } 21 }
由于Windows服务没有直接的用户交互,服务的状态必须通过记录日志才可知晓。要测试windows服务,可以通过重写服务里面的方法,在方法里面记录日志来实现。
1、新建Common类,类里面有一个WriteLog记录日志的方法。日志路径写在配置文件里面,可以实现项目的灵活性。
1 namespace WindowsServiceDemo 2 { 3 public class Common 4 { 5 /// <summary> 6 /// 记录日志 7 /// </summary> 8 /// <param name="strInfo"></param> 9 public static void WriteLog(string strInfo) 10 { 11 string strPath=ConfigurationManager.AppSettings["FilePath"]; 12 using (StreamWriter sw = new StreamWriter(strPath, true)) 13 { 14 sw.WriteLine(strInfo + ",当前时间:" + DateTime.Now.ToString()); 15 sw.Close(); 16 } 17 18 } 19 } 20 }
2、在Service1的设计界面点右键-->查看代码,打开Service1的代码,分别重写OnStart()、OnStop()、OnPause()、OnContinue()方法,在方法里面调用Common类的WriteLog方法来记录服务的运行状态。
1 namespace WindowsServiceDemo 2 { 3 public partial class MyService : ServiceBase 4 { 5 public MyService() 6 { 7 InitializeComponent(); 8 } 9 10 /// <summary> 11 /// 服务启动时执行的代码 12 /// </summary> 13 /// <param name="args"></param> 14 protected override void OnStart(string[] args) 15 { 16 try 17 { 18 Common.WriteLog("服务启动"); 19 } 20 catch (Exception ex) 21 { 22 Common.WriteLog("服务启动出错:"+ex.Message); 23 } 24 } 25 26 /// <summary> 27 /// 服务停止时执行的代码 28 /// </summary> 29 protected override void OnStop() 30 { 31 try 32 { 33 Common.WriteLog("服务停止"); 34 } 35 catch (Exception ex) 36 { 37 38 Common.WriteLog("服务停止出错:"+ex.Message); 39 } 40 } 41 42 /// <summary> 43 /// 服务暂停时执行的代码 44 /// </summary> 45 protected override void OnPause() 46 { 47 try 48 { 49 Common.WriteLog("服务暂停"); 50 } 51 catch (Exception ex) 52 { 53 54 Common.WriteLog("服务暂停出错:"+ex.Message); 55 } 56 } 57 58 /// <summary> 59 /// 服务恢复时执行的代码 60 /// </summary> 61 protected override void OnContinue() 62 { 63 try 64 { 65 Common.WriteLog("服务恢复"); 66 } 67 catch (Exception ex) 68 { 69 70 Common.WriteLog("服务恢复出错:"+ex.Message); 71 } 72 } 73 74 } 75 }
3、在服务控制管理器里面分别启动、暂停、恢复、停止服务,查看生成的日志:
日志里面正确记录了服务的运行状态,证明服务没有问题。
二、调试Windows服务
调试Windows服务,可以采用将服务附加到进程的方法。
1、在菜单栏选项里面选择调试-->附加到进程
2、在附加到进程界面,选择相应的服务进程,点击附加。
注意:要把服务附加到进程,必须保证服务是启动状态,否则在进程里面看不到服务的进程。
三、总结:
1、Windows服务调试不能直接F5,可以通过附加到进程方式调试(调试前提:将服务启动、以管理员身份运行VS)
2、Windows服务由于没有直接的用户交互,服务的状态必须通过日志才可知晓,恰当的加入try catch
3、所有可能发生变化的内容都不要写死,尽量通过配置文件来实现,这是项目灵活性的重要指标
4、Windows服务多用于定时操作、大数据量操作、监控操作等方面