這篇來紀錄一下如何撰寫固定時間執行服務以及如何偵錯
好不容易把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進行除錯