背景
同事寫的一個程式每天定時將一個二進位檔案分析,轉存為資料庫。目前這個程式不便之處是伺服器重啟後必須要登入系統,開啟這個程式才可以。還有業務出現了一些變化,需要修改程式,加之前也沒寫過windows服務程式,所以趁周末學習一下。
過程
肯定是先上部落格園搜尋一下,找了個blog看看,熟悉一下。
開啟vs2008,建立一個windows服務項目,開始把代碼搬過來。
- 修改預設產生的Service1.cs檔案名稱使之符合公司規範,並相應修改Program裡的類名
- 在下面兩個方法中初始化,記錄一下事件protected override void OnStart(string[] args)
{
}
protected override void OnStop()
{
}
- 記錄事件是在工具列拖了個eventLog,這個注意需要自己指定source屬性。這樣在系統日誌裡面就可以看到一些日誌了。
eventLog.WriteEntry(message + " 時間:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm", DateTimeFormatInfo.InvariantInfo));
- 再拖一個Timer控制項,用於定時執行
- 在Service.cs上點擊右鍵添加一個安裝程式,serviceProcessInstaller中設定登入類型,serviceInstaller設定服務名,描述和啟動類型
- 剩下的就是把同事的代碼整理整理,沒敢說是重構,感覺重構屬於高深技術,呵呵
- 在OnStart中設定Timer的Enable屬性,在Timer的timer_Tick事件中執行。
- 用於以前的程式用到了config配置一些東西,建立一個config檔案,自己建立的不能自動copy到debug目錄好像,需要自己在項目屬性中設定一下,如果不嫌麻煩,可以手動拷貝過去。
- ConfigurationManager.AppSettings["SourceServer"]這個需要添加引用System.configuration。
- 編譯通過,下面就是安裝這個服務進行測試了,不能像一般的程式那樣,直接運行,這個需要安裝到系統服務,然後用附加程式的方法調試。安裝服務最好吧installutil.exe拷貝一個到程式目錄,這樣就不用每次都用那個vs的命令列進了。以後安裝也方便。 問題
調試發現並沒有執行 timer_Tick裡的程式,繼續部落格園搜尋,發現VS2008用工具箱拖的那個timer是system.windows.forms下面的timer,此timer在多線程下有問題,而windows服務預設就是起的多線程,所以沒有執行。不知道ms為啥在這個裡面拖出來的是這個timer,還是我的個例。
換成
System.Timers.Timer timer = new System.Timers.Timer();
timer.Enabled = true;
timer.Interval = 600000;timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Tick);
搞定。
遺留 從附加程式的方法可以調試,但是不能調試OnStart裡面的代碼啊,因為只要服務運行起來後才可以附加,等你附加上後Onstart早跑過了。
所以不知道這個函數裡面的代碼怎麼調試?難道是在這個裡面加sleep延遲一下?