第一個任務--C# Windows服務(三)

來源:互聯網
上載者:User

標籤: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,可以看到服務已經在跑了

再試試卸載:

恩,也蠻好的,是不是一下覺得厲害多了,哈哈,我自己倒覺得還不錯。

總之這個小程式寫到這裡就算是告一段落了,以後如果有時間還會再改良一下,或者加入一些新的功能。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.