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


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

  1.創建項目,新建服務

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

  

 

 

   起個名字:DataAsyncService,點擊 "確定" 按鈕。

  2.添加安裝程序

   彈出一個,啥都沒有只有一句話的黑色面板,這是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服務應用程序創建完畢,點擊 "生成" > "生成解決方案",然后就可以打包安裝了,是不是有點太簡單。。。

  

 

   4.安裝Windows服務

  在 "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,大功告成。

 

 

 

 

     

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM