C#實(shí)現(xiàn)Windows服務(wù)測試與調(diào)試
一、測試Windows服務(wù)
為了使Windows服務(wù)程序能夠正常運(yùn)行,我們需要像創(chuàng)建一般應(yīng)用程序那樣為它創(chuàng)建一個(gè)程序的入口點(diǎn)。像其他應(yīng)用程序一樣,Windows服務(wù)也是在Program.cs的Main()函數(shù)中完成這個(gè)操作。首先我們在Main()函數(shù)中創(chuàng)建一個(gè)Windows服務(wù)的實(shí)例,該實(shí)例應(yīng)該是ServiceBase類的某個(gè)子類的對象,然后我們調(diào)用由基類ServiceBase類定義的一個(gè)Run()方法。然而調(diào)用Run()方法并不意味著就開始了Windows服務(wù)程序,必須要等到該對象的OnStart()方法被調(diào)用時(shí)服務(wù)才算真正開始運(yùn)行。如果你想在一個(gè)Windows服務(wù)程序中同時(shí)啟動(dòng)多個(gè)服務(wù),那么只要在Main()函數(shù)中定義多個(gè)ServiceBase類的子類的實(shí)例對象就可以了,方法就是創(chuàng)建一個(gè)ServiceBase類的數(shù)組對象。
namespace WindowsServiceDemo { static class Program { /// <summary> /// 應(yīng)用程序的主入口點(diǎn)。 /// </summary> static void Main() { ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] { //服務(wù)1 new MyService(), //服務(wù)2 new Service1() }; ServiceBase.Run(ServicesToRun); } } }
由于Windows服務(wù)沒有直接的用戶交互,服務(wù)的狀態(tài)必須通過記錄日志才可知曉。要測試windows服務(wù),可以通過重寫服務(wù)里面的方法,在方法里面記錄日志來實(shí)現(xiàn)。
1、新建Common類,類里面有一個(gè)WriteLog記錄日志的方法。日志路徑寫在配置文件里面,可以實(shí)現(xiàn)項(xiàng)目的靈活性。
namespace WindowsServiceDemo { public class Common { /// <summary> /// 記錄日志 /// </summary> /// <param name="strInfo"></param> public static void WriteLog(string strInfo) { string strPath=ConfigurationManager.AppSettings["FilePath"]; using (StreamWriter sw = new StreamWriter(strPath, true)) { sw.WriteLine(strInfo + ",當(dāng)前時(shí)間:" + DateTime.Now.ToString()); sw.Close(); } } } }
2、在Service1的設(shè)計(jì)界面點(diǎn)右鍵-->查看代碼,打開Service1的代碼,分別重寫OnStart()、OnStop()、OnPause()、OnContinue()方法,在方法里面調(diào)用Common類的WriteLog方法來記錄服務(wù)的運(yùn)行狀態(tài)。
namespace WindowsServiceDemo { public partial class MyService : ServiceBase { public MyService() { InitializeComponent(); } /// <summary> /// 服務(wù)啟動(dòng)時(shí)執(zhí)行的代碼 /// </summary> /// <param name="args"></param> protected override void OnStart(string[] args) { try { Common.WriteLog("服務(wù)啟動(dòng)"); } catch (Exception ex) { Common.WriteLog("服務(wù)啟動(dòng)出錯(cuò):"+ex.Message); } } /// <summary> /// 服務(wù)停止時(shí)執(zhí)行的代碼 /// </summary> protected override void OnStop() { try { Common.WriteLog("服務(wù)停止"); } catch (Exception ex) { Common.WriteLog("服務(wù)停止出錯(cuò):"+ex.Message); } } /// <summary> /// 服務(wù)暫停時(shí)執(zhí)行的代碼 /// </summary> protected override void OnPause() { try { Common.WriteLog("服務(wù)暫停"); } catch (Exception ex) { Common.WriteLog("服務(wù)暫停出錯(cuò):"+ex.Message); } } /// <summary> /// 服務(wù)恢復(fù)時(shí)執(zhí)行的代碼 /// </summary> protected override void OnContinue() { try { Common.WriteLog("服務(wù)恢復(fù)"); } catch (Exception ex) { Common.WriteLog("服務(wù)恢復(fù)出錯(cuò):"+ex.Message); } } } }
3、在服務(wù)控制管理器里面分別啟動(dòng)、暫停、恢復(fù)、停止服務(wù),查看生成的日志:
日志里面正確記錄了服務(wù)的運(yùn)行狀態(tài),證明服務(wù)沒有問題。
二、調(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,可以通過附加到進(jìn)程方式調(diào)試(調(diào)試前提:將服務(wù)啟動(dòng)、以管理員身份運(yùn)行VS)
- 2、Windows服務(wù)由于沒有直接的用戶交互,服務(wù)的狀態(tài)必須通過日志才可知曉,恰當(dāng)?shù)募尤雝ry catch
- 3、所有可能發(fā)生變化的內(nèi)容都不要寫死,盡量通過配置文件來實(shí)現(xiàn),這是項(xiàng)目靈活性的重要指標(biāo)
- 4、Windows服務(wù)多用于定時(shí)操作、大數(shù)據(jù)量操作、監(jiān)控操作等方面
到此這篇關(guān)于C#實(shí)現(xiàn)Windows服務(wù)測試與調(diào)試的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C#創(chuàng)建Windows服務(wù)與服務(wù)的安裝、卸載
- C#創(chuàng)建控制Windows服務(wù)
- C#創(chuàng)建Windows服務(wù)的實(shí)現(xiàn)方法
- C#對Windows服務(wù)組的啟動(dòng)與停止操作
- C#使用windows服務(wù)開啟應(yīng)用程序的方法
- C#實(shí)現(xiàn)操作windows系統(tǒng)服務(wù)(service)的方法
- c#創(chuàng)建windows服務(wù)入門教程實(shí)例
- c#創(chuàng)建windows服務(wù)(Windows Services)詳細(xì)步驟
- C#編寫Windows服務(wù)實(shí)例代碼
- C#操作Windows服務(wù)類System.ServiceProcess.ServiceBase
相關(guān)文章
Unity實(shí)現(xiàn)弧形移動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)弧形移動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06C#基礎(chǔ)知識(shí)之GetType與typeof的區(qū)別小結(jié)
在比較對象時(shí),需要了解他們的類型,才能決定他們的值是否能比較。所有的類都從System.Object中繼承了GetType()方法,常常與typeo()運(yùn)算符一起使用。這篇文章主要給大家介紹了關(guān)于C#基礎(chǔ)知識(shí)之GetType與typeof區(qū)別的相關(guān)資料,需要的朋友可以參考下2021-06-06C#連接mysql數(shù)據(jù)庫完整實(shí)例
這篇文章主要介紹了C#連接mysql數(shù)據(jù)庫的方法,以一個(gè)完整實(shí)例形式分析了C#操作mysql數(shù)據(jù)庫連接的基本技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-05-05詳解C# List<T>的Contains,Exists,Any,Where性能對比
這篇文章主要介紹了詳解C# List<T>的Contains,Exists,Any,Where性能對比,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12