首先,請原諒我是一個小白,一直到前段時間才在工作需要的情況下寫了第一個windows服務。首先說一下為什么寫這個windows服務吧,也就是什么需求要我來寫這么一個東西。公司的項目中,需要一個預警功能(從數據庫里取出需要的日期,在這個日期的前兩天向相應的用戶以短信的形式發出提醒)。因為不是一個日期,並且日期不是固定的。所以需要每一天都要在規定的時間向服務器發出請求,這需要后台自動執行的事件。我一直覺得這種功能很牛X的,就因為它們是自動執行的,哈哈。最后就用到了這么這個沒有寫過的windows服務。其實前面在做這個項目的時候,也遇到了類似的事情(小區居民回復物業系統發出的短信,比如短信投票),需要及時接受並且做出相應的回復或操作。為了解決這個問題我是做了一個定時器放在Global.asax文件里的。但是這中方法有個弊端,就是需要啟動項目才能讓計時器跑起來,而Windows Service就完美的解決了這個問題。只要在服務器上啟動服務,不管項目是否運行,服務里的程序依然可以運行。啰啰嗦嗦的也不知道講清楚沒有,開始記錄新建Windows Service的過程吧。
因為是新建第一個Windows Service,所以很艱難,一個字——累!因為周圍的同事、同學因為工作原因基本上都很少接觸這個東西。首先百度了方法,在這里也詳細記錄下來,請原諒,因為我腦袋的內存小,怕以后不知道怎么做,只能詳細的記錄了。哦,我用的是asp.net。
1.首先創建一個空的解決方案,主要是記錄windows服務,所以asp.net里面什么也沒有操作

2.新建windows服務

3.在windows服務內編寫程序,首先切換到Service1的代碼視圖,從代碼中兩個程序已經自動生成的兩個方法名字可以看出,OnStart()為開始,OnStop()為結束。其實還有暫停OnPause(),繼續OnContinue()兩個方法。
1 namespace WindowsService 2 { 3 public partial class Service1 : ServiceBase 4 { 5 public Service1() 6 { 7 InitializeComponent(); 8 } 9 10 //啟動服務時執行 11 protected override void OnStart(string[] args) 12 { 13 } 14 //停止服務時執行 15 protected override void OnStop() 16 { 17 } 18 } 19 }
我把我的代碼貼出來吧
1 namespace WinService 2 { 3 public partial class Service1 : ServiceBase 4 { 5 public Service1() 6 { 7 InitializeComponent(); 8 } 9 10 System.Timers.Timer timer = new System.Timers.Timer(); 11 common com = new common(); 12 SMS sms = new SMS(); 13 protected override void OnStart(string[] args) 14 { 15 timer.Enabled = true; 16 timer.Interval = 60000;//執行間隔時間,單位為毫秒 每分鍾執行一次 17 timer.Start(); 18 timer.Elapsed += new System.Timers.ElapsedEventHandler(Timer1_Elapsed); 19 } 20 21 protected override void OnStop() 22 { 23 timer.Enabled = false; 24 } 25 26 private void Timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 27 { 28 int intHour = e.SignalTime.Hour; //獲得當前的小時 29 int intMinute = e.SignalTime.Minute; //獲得當前的分鍾 30 int intSecond = e.SignalTime.Second; //獲得當前的秒 31 32 /*每分鍾執行一次*/ 33 //更新投票結束狀態 34 com.updateVoteState(); 35 //短信 36 sms.SMSVote(); 37 /*每分鍾執行一次*/ 38 39 // 每天的10:30執行這個方法 40 int iHour = 10; 41 int iMinute = 30; 42 if (intHour == iHour && intMinute == iMinute ) 43 { 44 //預警功能 45 com.Warning(); 46 } 47 } 48 49 } 50 }
我在服務里面放了,每分鍾執行的方法,有每天只需的方法。
4.要實現的功能都寫好了,下面是添加服務的安裝程序了。首先添加

在工具箱中找到serviceProcessInstaller和serviceInstaller,並添加到Installer.cs中

設置serviceInstaller

設置serviceProcessInstaller

5.前的都做好了,服務基本上就完成了,最后一步就是注冊了。前邊的在網上的各位大神的幫助下很順利的完成了,就是在注冊這里把我難到了,一直失敗一直失敗,弄到我都沒有脾氣了。百度新建windows服務,大部分后面的注冊介紹的方法是這樣的。
(1)打開命令提示
(2)輸入installutil C:\Users\win10\Documents\Visual Studio 2012\Projects\WindowsService\bin\Debug\WindowsService.exe(安裝)。
或者是 輸入C:\Windows\Microsoft.NET\Framework\v4.0.30319(安裝)
這些方法好像在win7上可以安裝成功,可是我安裝的是win10的就悲催了,怎么都不能實現。最后還是一個同學做過,告訴了我一種方法
(1)以管理員身份運行命令提示
(2)輸入sc create test binPath="C:\Users\win10\Documents\Visual Studio 2012\Projects\WindowsService\bin\Debug\WindowsService.exe"(注冊)
sc start test(啟動)
sc start test (啟動服務)
sc stop test (停止服務)
sc delete test (從注冊表刪除服務)
另外,服務的名稱不知道是不是必須是解決方面的名字哦,我用其它的好像都不行,沒有認真的去試這個。不知道為什么百度新建windows服務是就是沒有找到這種注冊服務的方法,百度sc create是就都出現了,所以在注冊這里把弄的很狼狽。 下面這樣一段是我在百度百科上看到的,可以參考一下
Sc create 是Windows DOS命令,用於創建Windows服務。適用於:Windows 7,Windows Server 2003,Windows Server 2003 R2, Windows Server 2003 with SP1, Windows Server 2003 with SP2,Windows Server 2008, Windows Server 2008 R2,Windows Vista。
