標籤:c style class blog code java
最後就剩下設定時間和部署項目了
我的服務進入系統的時候是自啟動的,但是如果電腦開啟以後這周不是周五那它根本就沒有存在的意義,所以要寫一個停止服務的方法:
/// <summary>/// 停止Windows服務/// </summary>public static void StopmyService(){ try { string m_ServiceName = "WeeklyReport"; ServiceController service = new ServiceController(m_ServiceName); if (service.Status != ServiceControllerStatus.Stopped && service.Status != ServiceControllerStatus.StopPending) //若該服務不是停用狀態,才將其停止 { service.Stop(); } } catch (Exception E) { throw new Exception("服務無法停用"); }}
在Elapsed事件中寫入:
private void TimeMachine_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { //初始1秒觸發一次 if (DateTime.Now.DayOfWeek == DayOfWeek.Friday) { //如果判斷服務開啟的時間為14點之前,那麼改為1小時觸發一次 if (DateTime.Now.Hour < 14) { TimeMachine.Interval = 3600000D; } if (DateTime.Now.Hour == 14 && DateTime.Now.Minute >= 00 && DateTime.Now.Minute < 59) //14點之後改為30秒觸發一次 { TimeMachine.Interval = 30000D; } //快到15點時,改為1秒觸發一次 if (DateTime.Now.Hour == 14 && DateTime.Now.Minute == 59 && (DateTime.Now.Second >= 30 && DateTime.Now.Second < 60)) { TimeMachine.Interval = 1000D; } if (DateTime.Now.Hour == 15 && DateTime.Now.Minute == 0) { Interop.ShowMessageBox("今天,你交周報了嗎? 恩?", "友情提示"); //停止 StopmyService(); } if (DateTime.Now.Hour > 15 || (DateTime.Now.Hour == 15 && DateTime.Now.Minute > 0)) //提醒以後自動停止服務 { StopmyService(); } } else { //如果不是周五,啟動1秒後自動停止服務 StopmyService(); } }
這樣寫雖然有點折騰,但是我心裡舒服...
雖然Timer耗不了什麼效能,但是我也不願意讓它做太多無效的計數,另外我發現,就算服務停止了,彈出的視窗也不會關掉,這應該是系統自行發出的指令,跟服務無關,感歎大神的能力就是不一樣。
現在程式寫好了,把我產生好的服務還有最初做的兩個“安裝啟動服務”和“卸載服務”的bat打包發給老大就能交差了。
但是我聯絡他,他卻不睬我。媽蛋,什麼領導,叫我做東西我做好了,你至少回應我一下吧,就算不說“讓同事們都裝上吧”,好歹說一句“蠻好的”,“不錯”之類的話吧。
居然連一句話都沒有,拿我當猴耍啊。唉,反正我也是為了練技術才來實習的,不計較那麼多了。
之後又閑下來了,我就開始考慮這個服務能不能改進一下,我給別人一個壓縮檔還得解壓,然後雙擊bat...一般的電腦使用者都不會知道什麼是bat吧,看起來也不夠檔次啊,而且這個弊端也不少,例如服務的路徑不能放到含有中文的目錄下,不然bat檔案可能取不到路徑,再例如總需要用管理員權限運行,很容易忽略等等。
要是能把這個打包成一個安裝程式多好, 像我們用過的軟體那樣,一路“下一步”,安裝完成!感覺高端多了,而且安裝完後服務自動安裝啟動,全自動一條龍啊有木有?!
然後我就去網上找到了一些關於安裝項目的教程,還真有不少,具體的建立過程我就不說了,網上很多資料可查。
說幾點關鍵的,第一,安裝項目裡比較主要的就兩個東西,一個是檔案系統,另一個是自訂動作。
檔案系統就是確定你要安裝的東西,自訂動作就是在不同的狀況下要乾的事
第二,在自訂動作裡添加自訂動作“主輸出來自(WeeklyReport)(活動)”(這是我的項目)這個之後,產生安裝程式後就可以看到服務被安裝上了,但是沒啟動,怎麼讓它在安裝後自動啟動呢?我們需要在解決方案中新添加一個類庫“CustomAction”,然後在這個類庫裡也添加一個安裝程式MyInstallerClassDll.cs,在裡面添加如下代碼:
public override void Commit(IDictionary savedState) { base.Commit(savedState); //Auot start service after the installation is completed ServiceController sc = new ServiceController("WeeklyReport"); if (sc.Status.Equals(ServiceControllerStatus.Stopped)) { sc.Start(); } }
把這個CustomAction也添加到檔案系統中,再在自訂動作裡添加它--“主輸出來自(CustomAction)(活動)”。
注意盡量每個檔案夾裡都添加上這些項目輸出,否則安裝過程可能會報錯。
好了,產生安裝程式,我們現在運行一下:
OK,非常Nice,可以看到服務已經在跑了
再試試卸載:
恩,也蠻好的,是不是一下覺得厲害多了,哈哈,我自己倒覺得還不錯。
總之這個小程式寫到這裡就算是告一段落了,以後如果有時間還會再改良一下,或者加入一些新的功能。