開篇語
因工作內容需要做一個windows服務,此前並沒有相關經驗,所以做了一個demo來跑跑這個梗(高手跳過,需要的來踩)~
效果如下:打開服務,可以找到我們新增的一個windows服務,這個demo是定時向一個txt文件輸出一句話
生成的以日期命名的txt文件
打開文件結果如下:
全過程梳理
本文將只粗略簡單的介紹一下windows服務是如何開發和安裝的
一、創建windows服務
如圖新建一個Windows服務
進入程序如圖
空白服務如下
1 public partial class Service1 : ServiceBase 2 { 3 System.Threading.Timer recordTimer; 4 5 6 public Service1() 7 { 8 InitializeComponent(); 9 } 10 11 12 protected override void OnStart(string[] args) 13 { 14 } 15 16 17 protected override void OnStop() 18 { 19 } 20 }
只要在OnStart里完成你的功能代碼即可。本例中我們做一個定時向本地文件寫記錄的功能。
創建一個類,用戶寫文件
1 /// <summary> 2 /// 保存至本地文件 3 /// </summary> 4 /// <param name="ETMID"></param> 5 /// <param name="content"></param> 6 public static void SaveRecord(string content) 7 { 8 if (string.IsNullOrEmpty(content)) 9 { 10 return; 11 } 12 FileStream fileStream = null; 13 StreamWriter streamWriter = null; 14 try 15 { 16 string path = Path.Combine(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase, string.Format("{0:yyyyMMdd}", DateTime.Now)); 17 18 19 using (fileStream = new FileStream(path, FileMode.Append, FileAccess.Write)) 20 { 21 using (streamWriter = new StreamWriter(fileStream)) 22 { 23 streamWriter.Write(content); 24 25 26 if (streamWriter != null) 27 { 28 streamWriter.Close(); 29 } 30 } 31 32 if (fileStream != null) 33 { 34 fileStream.Close(); 35 } 36 } 37 } 38 catch { } 39 }
如圖那么在Service1中調用
1 public partial class Service1 : ServiceBase 2 { 3 System.Threading.Timer recordTimer; 4 public Service1() 5 { 6 InitializeComponent(); 7 } 8 9 protected override void OnStart(string[] args) 10 { 11 IntialSaveRecord(); 12 } 13 /// <summary> 14 /// 定時檢查,並執行方法 15 /// </summary> 16 /// <param name="source"></param> 17 /// <param name="e"></param> 18 private void IntialSaveRecord() 19 { 20 TimerCallback timerCallback = new TimerCallback(CallbackTask); 21 22 AutoResetEvent autoEvent = new AutoResetEvent(false); 23 recordTimer = new System.Threading.Timer(timerCallback, autoEvent, 0, 10000);//其中參數10000表示延時執行服務的時間間隔,毫秒為單位 24 } 25 //方法 26 private void CallbackTask(Object stateInfo) 27 { 28 Show_Java.SaveRecord(string.Format(@"當前記錄時間:{0},狀況:程序運行正常!", DateTime.Now)); 29 } 30 31 protected override void OnStop() 32 { 33 if (recordTimer != null) 34 { 35 recordTimer.Dispose(); 36 } 37 } 38 }
安裝程序
這樣服務算是寫的差不多了,下面添加一個安裝程序,用於安裝服務。
如圖,在service1頁面空白處右鍵-添加安裝程序
添加一個安裝程序,如圖,添加完成后
設置相應的屬性,給serviceInstaller1設置屬性,主要是描述信息。如圖,
給serviceProcessInstaller1設置,主要是account。一般選localsystem,如圖
這樣服務已經寫好了。那么如何添加到windows服務里面去呢。這里推薦一種簡單實用的方法(也可以通過代碼來安裝,這里就不做過多講解了)
安裝服務
上面寫好的服務,最終生成的是一個exe文件。如圖,
安裝程序安裝時需要用到這個exe的路徑,所以方便起見,將這個生成的exe文件拷貝至安裝程序的運行目錄下。(這里我將exe拷貝到D盤shows文件夾下面)
用管理員權限打開cmd窗口
然后分別執行
@SET FrameworkDir=%WINDIR%\Microsoft.NET\Framework
@SET FrameworkVersion=v2.0.50727
@SET PATH=%FrameworkDir%\%FrameworkVersion%;%WINDIR%\System32;%PATH%;
InstallUtil.exe D:\路徑\程序名稱.exe //安裝服務
InstallUtil.exe /u D:\路徑\程序名稱.exe //卸載服務(程序安裝好了,如果想要修改,需要先卸載該服務,再次執行安裝)
運行后若無錯誤,效果應該如下
運行完后在服務中查看,如圖:
再在安裝目錄下看記錄的文件(因為我們設置項目的時候選的是手動,此時要記住啟動該服務,程序才會定時執行)
這樣,一個windows服務算是安裝成功了。(方法多種多樣,希望各位多提寶貴意見,不勝感激~)