C# windows Service (code撰寫及偵錯)

  • 3830
  • 0
  • C#
  • 2019-03-20

這篇來紀錄一下如何撰寫固定時間執行服務以及如何偵錯

好不容易把windows 服務建立好了,對於一個菜鳥根本不知道如何下手寫在onStart()裡面,因此先參考了網路上的code寫法。


固定時間執行檔案

先來看看我們要的需求,主管說要在某個特定時間去更新資料庫,更新資料庫相信大家都會寫但要怎麼固定那個時間呢??

在C#中,有個Timer的東西是一個定時器,它可以按照你指定的時間或是一個間隔時間去執行一件事情。

時間間格可能是說我每1分鐘或是1小時檢查一次,而固定時間就是可能晚上12點要執行。

下面的範例:我們在onStart方法裡面先建立一個timer 並且讓它一分鐘去執行一次writeLog方法

public partial class Service1 : ServiceBase
{
   public Service1()
   {
      InitializeComponent();
   }
   protected override void OnStart(string[] args)
   {
     //建立一個timer
     System.Timers.Timer MyTimer = new System.Timers.Timer(); 
     //Elapsed代表,timer設定的時間到後要做什麼事情
     MyTimer.Elapsed += new ElapsedEventHandler(writeLog); 

     //做什麼事情可以寫成method丟進去,sample為寫log

     MyTimer.Interval = 60000; //代表時間間隔,單位為毫秒,設定2000代表2秒
     MyTimer.Start(); //啟動timer            
   }
   
    private void writeLog(object sender, ElapsedEventArgs e) //寫log
    {

       //do something
    }

}

但是這時候就會說可是我不要讓它一直執行啊!! 我只是希望可以在晚上十二點去做事情

這時候你必須在writeLog 的地方去指定說我的時間要到何時去執行,這樣就代表我希望這個writeLog 會在 17:31 執行writeLog function

private void writeLog(object sender, ElapsedEventArgs e) //寫log
{
   //如果当前时间是17点31分則運作            
   if (DateTime.Now.Hour == 17 && DateTime.Now.Minute == 31)
   {
      //更新使用者資料表
      updateUsers();
               
   }
}

執行完程式後,我們會希望到底這樣會不會完全正確,看不到它跑的樣子感覺就覺得怕有疏漏,因此我們可以讓它把紀錄寫在txt檔案裡面

這樣我們就可以知道它到底怎麼跑的,以及有沒有跑完你所有的資料。

public partial class Service1 : ServiceBase
{
        private String path = "D:\\insLog.txt"; //寫檔路徑      


      public void update(){
         //....sqlConnetction 
         using (StreamWriter sw = File.AppendText(path))
         {
             sw.WriteLine("update時間" + System.DateTime.Now.ToString());
             sw.WriteLine("內容...");
         } 

      }
}

大致上就是這樣便可以建置服務,然後啟動。

但是人生總是不會這麼順遂,因為windows Service 並不能直接debug偵錯,所以當你的code一有問題,不是啟動不了服務就是跑一半,有時候我們來來回回安裝、解除安裝服務也會壞掉

我就一直碰到這種解釋,它怎樣都不讓我啟動。網路上有人提供的辦法是重新開機、或是將服務關掉...

結果呢!! 我發現根本就是我程式有問題所以無法被啟動。


如何偵錯Windows Service

偵錯的方法有很多種,像是windows Service 其實與 consoleApplication的專案樣子相似,所以有些人會在新增一個專案然後加入windows service 的專案參考,在改寫一點東西。

但是,我實在不想要改寫我的程式碼,因為改寫完 之後還得再把它改回來,實在是很麻煩。

所以我參考了 CHRIS CHEN 所提供的方法,將程式碼copy進去並執行,果然可以成功偵錯啦!!

有無偵錯真的差很多,本來還想說我的都是 update insert select 資料 沒什麼好寫錯的吧~ 有必要花我這麼多時間找偵錯使用方法

但真的不要鐵齒,因為總是會有小錯誤的~~

參考網址: [Windows Service] 如何對Windows Service進行除錯

 


參考資料:

1. C#使用Timer.Interval指定时间间隔与指定时间执行事件

2.[Windows Service] 如何對Windows Service進行除錯