Windows服务二:测试新建的服务、调试Windows服务
一、測(cè)試Windows服務(wù)
為了使Windows服務(wù)程序能夠正常運(yùn)行,我們需要像創(chuàng)建一般應(yīng)用程序那樣為它創(chuàng)建一個(gè)程序的入口點(diǎn)。像其他應(yīng)用程序一樣,Windows服務(wù)也是在Program.cs的Main()函數(shù)中完成這個(gè)操作。首先我們?cè)贛ain()函數(shù)中創(chuàng)建一個(gè)Windows服務(wù)的實(shí)例,該實(shí)例應(yīng)該是ServiceBase類的某個(gè)子類的對(duì)象,然后我們調(diào)用由基類ServiceBase類定義的一個(gè)Run()方法。然而調(diào)用Run()方法并不意味著就開(kāi)始了Windows服務(wù)程序,必須要等到該對(duì)象的OnStart()方法被調(diào)用時(shí)服務(wù)才算真正開(kāi)始運(yùn)行。如果你想在一個(gè)Windows服務(wù)程序中同時(shí)啟動(dòng)多個(gè)服務(wù),那么只要在Main()函數(shù)中定義多個(gè)ServiceBase類的子類的實(shí)例對(duì)象就可以了,方法就是創(chuàng)建一個(gè)ServiceBase類的數(shù)組對(duì)象。
1 namespace WindowsServiceDemo 2 { 3 static class Program 4 { 5 /// <summary> 6 /// 應(yīng)用程序的主入口點(diǎn)。 7 /// </summary> 8 static void Main() 9 { 10 ServiceBase[] ServicesToRun; 11 ServicesToRun = new ServiceBase[] 12 { 13 //服務(wù)1 14 new MyService(), 15 //服務(wù)2 16 new Service1() 17 }; 18 ServiceBase.Run(ServicesToRun); 19 } 20 } 21 }由于Windows服務(wù)沒(méi)有直接的用戶交互,服務(wù)的狀態(tài)必須通過(guò)記錄日志才可知曉。要測(cè)試windows服務(wù),可以通過(guò)重寫服務(wù)里面的方法,在方法里面記錄日志來(lái)實(shí)現(xiàn)。
1、新建Common類,類里面有一個(gè)WriteLog記錄日志的方法。日志路徑寫在配置文件里面,可以實(shí)現(xiàn)項(xiàng)目的靈活性。
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 + ",當(dāng)前時(shí)間:" + DateTime.Now.ToString()); 15 sw.Close(); 16 } 17 18 } 19 } 20 } View Code2、在Service1的設(shè)計(jì)界面點(diǎn)右鍵-->查看代碼,打開(kāi)Service1的代碼,分別重寫OnStart()、OnStop()、OnPause()、OnContinue()方法,在方法里面調(diào)用Common類的WriteLog方法來(lái)記錄服務(wù)的運(yùn)行狀態(tài)。
1 namespace WindowsServiceDemo 2 { 3 public partial class MyService : ServiceBase 4 { 5 public MyService() 6 { 7 InitializeComponent(); 8 } 9 10 /// <summary> 11 /// 服務(wù)啟動(dòng)時(shí)執(zhí)行的代碼 12 /// </summary> 13 /// <param name="args"></param> 14 protected override void OnStart(string[] args) 15 { 16 try 17 { 18 Common.WriteLog("服務(wù)啟動(dòng)"); 19 } 20 catch (Exception ex) 21 { 22 Common.WriteLog("服務(wù)啟動(dòng)出錯(cuò):"+ex.Message); 23 } 24 } 25 26 /// <summary> 27 /// 服務(wù)停止時(shí)執(zhí)行的代碼 28 /// </summary> 29 protected override void OnStop() 30 { 31 try 32 { 33 Common.WriteLog("服務(wù)停止"); 34 } 35 catch (Exception ex) 36 { 37 38 Common.WriteLog("服務(wù)停止出錯(cuò):"+ex.Message); 39 } 40 } 41 42 /// <summary> 43 /// 服務(wù)暫停時(shí)執(zhí)行的代碼 44 /// </summary> 45 protected override void OnPause() 46 { 47 try 48 { 49 Common.WriteLog("服務(wù)暫停"); 50 } 51 catch (Exception ex) 52 { 53 54 Common.WriteLog("服務(wù)暫停出錯(cuò):"+ex.Message); 55 } 56 } 57 58 /// <summary> 59 /// 服務(wù)恢復(fù)時(shí)執(zhí)行的代碼 60 /// </summary> 61 protected override void OnContinue() 62 { 63 try 64 { 65 Common.WriteLog("服務(wù)恢復(fù)"); 66 } 67 catch (Exception ex) 68 { 69 70 Common.WriteLog("服務(wù)恢復(fù)出錯(cuò):"+ex.Message); 71 } 72 } 73 74 } 75 }3、在服務(wù)控制管理器里面分別啟動(dòng)、暫停、恢復(fù)、停止服務(wù),查看生成的日志:
日志里面正確記錄了服務(wù)的運(yùn)行狀態(tài),證明服務(wù)沒(méi)有問(wèn)題。
二、調(diào)試Windows服務(wù)
?調(diào)試Windows服務(wù),可以采用將服務(wù)附加到進(jìn)程的方法。
1、在菜單欄選項(xiàng)里面選擇調(diào)試-->附加到進(jìn)程
2、在附加到進(jìn)程界面,選擇相應(yīng)的服務(wù)進(jìn)程,點(diǎn)擊附加。
注意:要把服務(wù)附加到進(jìn)程,必須保證服務(wù)是啟動(dòng)狀態(tài),否則在進(jìn)程里面看不到服務(wù)的進(jìn)程。
三、總結(jié):
1、Windows服務(wù)調(diào)試不能直接F5,可以通過(guò)附加到進(jìn)程方式調(diào)試(調(diào)試前提:將服務(wù)啟動(dòng)、以管理員身份運(yùn)行VS)
2、Windows服務(wù)由于沒(méi)有直接的用戶交互,服務(wù)的狀態(tài)必須通過(guò)日志才可知曉,恰當(dāng)?shù)募尤雝ry catch
3、所有可能發(fā)生變化的內(nèi)容都不要寫死,盡量通過(guò)配置文件來(lái)實(shí)現(xiàn),這是項(xiàng)目靈活性的重要指標(biāo)
4、Windows服務(wù)多用于定時(shí)操作、大數(shù)據(jù)量操作、監(jiān)控操作等方面
?
轉(zhuǎn)載于:https://www.cnblogs.com/dotnet261010/p/6180801.html
總結(jié)
以上是生活随笔為你收集整理的Windows服务二:测试新建的服务、调试Windows服务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: usaco-sprime-superpr
- 下一篇: java信息管理系统总结_java实现科