C# windows服務,解決應用程序開機自啓問題

  最近在東營作一個超市購物的項目,業務體量很小,是僅供內部員工使用的內網應用程序,其中涉及一個商品數據同步的winform應用程序,有一個問題就是服務器重啓後,必須登陸服務器操做系統,手動啓動才行,因而就想改爲一個開機自啓動的程序,網上搜了一堆出來,我大體分爲兩種解決方案:一,把winform改爲開機自啓,主要思路就是更改註冊表,要麼直接改註冊表,要麼把改註冊表的代碼加在winform程序裏。二,把winform應用程序放到任務計劃裏,或者放到開機自啓文件夾裏(startup),或者由windows服務開機自啓後再啓動winform程序。而後分析了一下,改註冊表須要重啓服務器,現實不太容許,並且winfrom程序,操做系統重啓後,必須登陸進來才能打開,通常服務器宕機重啓是不會有人立馬登進來的,那麼未登陸的這段時間數據同步依舊沒法執行,而windows 服務開機自啓不須要登陸,因此果斷放棄winform的同步方式,改爲windows服務的方式同步數據,數據同步的主要業務邏輯不變,只是把定時器由winform的System.Windows.Forms.Timer換成了System.Timers。那麼如何建立一個windows服務應用程序呢,請繼續往下看:windows

  1.建立項目,新建服務服務器

  打開vs2017,選擇 "文件" > "新建" > "項目",在新建項目對話框中,選擇Windows服務(.NET Framework),以下圖:函數

  

 

 

   起個名字:DataAsyncService,點擊 "肯定" 按鈕。工具

  2.添加安裝程序spa

   彈出一個,啥都沒有隻有一句話的黑色面板,這是VS自動建立的Service1.cs的文件,此時,右鍵鼠標,選擇 "添加安裝程序",會添加一個名叫ProjectInstaller.cs的文件,和兩個安裝組件ServiceProcessInstaller 和 ServiceInstaller,這時解決方案裏有了三個類文件Programe.cs,ProjectInstaller.cs,Service1.cs,以下圖:操作系統

      

      

 

 

   如上圖,鼠標左鍵選中左邊的serviceProcessInstaller1組件,啥都不要動,而後點擊最右側工具欄的 "屬性"(或者按鍵盤F4鍵),在 "雜項" 中將Account的值選爲 "LocalService",選中serviceInstaller1組件,給Description、DisplayName、ServiceName自定義值,注意:把StartType的值,設置成 "Automatic",即開機自啓。(固然也能夠安裝服務後手動調屬性)調試

           

  3.處理業務邏輯日誌

  選擇解決方案裏的Service1.cs文件,鼠標右鍵 "查看代碼"(按鍵盤F7鍵),在OnStart()方法裏寫入你要處理的業務邏輯代碼,此時Windows服務應用程序建立完畢,點擊 "生成" > "生成解決方案",而後就能夠打包安裝了,是否是有點太簡單。。。orm

  

 

   4.安裝Windows服務blog

  在 "C:\Windows\Microsoft.NET\Framework\v4.0.30319" 這個路徑下,找到 "InstallUtil.exe" 這個可執行文件,複製到項目的生成目錄下(bin\Debug),固然你也能夠不這樣作,我這麼作純屬我的習慣,方便執行,以管理員身份運行cmd,進入到項目生成目錄下(選擇盤符,而後cd 路徑),執行如下命令:

  InstallUtil.exe DataAsyncService.exe     --安裝服務

  net start 超市購物商品定時同步服務      --啓動服務(或手動去服務裏啓動)

  以上,windows服務應用程序所有完成並執行。

  中止服務和卸載命令:

  net stop 超市購物商品定時同步服務           --中止服務

  InstallUtil.exe -u DataAsyncService.exe     --卸載服務

 

  5.windows服務啓動失敗

  若是在安裝windows服務的時候安裝失敗,不要擔憂,咱們能夠找到日誌,看看出了什麼錯,而後根據錯誤去解決問題。

  Ctrl + R,運行裏打開 "compmgmt.msc",進入"計算機管理" 界面,依此打開:"系統工具" > "事件查看器" > "Windows日誌" > "應用程序",找到剛剛服務啓動報的錯,找不到就向下滾動一下,很容易找到的,以下圖所示,報錯詳細信息裏記錄了代碼在什麼位置拋出異常,根據提示咱們去改相應代碼就能夠了。

  

 

 

  6.windows服務調試

  經過以上步驟5咱們能夠定位出錯位置,那WIndows服務應用程序能不能像控制檯或其餘程序那樣調試呢?Yes Sure!答案是確定的。有兩種調試方式,一種是附加到進程,這種方式不能進OnStart()方法,固然有其餘方式能夠解決,但此處不討論,這裏給出另外一個方式,下斷點,而後F5調試。

  首先,修改入口函數Main()方法,此方法在Program.cs這個類裏,直接上圖不bb:

  

  而後修改Service1.cs類裏面的OnStart()方法:

  

 

   修改完以後,在OnStart() 方法裏F9(或鼠標點擊)打上斷點,按F5,此時,進入斷點調試,而後一步一步向下執行便可。OK,大功告成。

相關文章
相關標籤/搜索