總結下今天將一個程序轉為windows服務(用C#)
背景
同事寫的一個程序每天定時將一個二進制文件分析,轉存為數據庫。目前這個程序不便之處是服務器重啟后必須要登錄系統,打開這個程序才可以。還有業務出現了一些變化,需要修改程序,加之前也沒寫過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延遲一下?
浙公網安備 33010602011771號