windows服務應用程序是一種長期運行在操做系統後臺的程序,它對於服務器環境特別適合,它沒有用戶界面,不會產生任何可視輸出,任何用戶輸出都回被寫進windows事件日誌。windows
計算機啓動時,服務會自動開始運行,他們不要用戶必定登錄才運行。數組
能夠經過選擇菜單「開始」-〉「控制面板」-〉「管理工具」-〉「服務」來查看現有系統中的服務,以下圖:服務器
建立一個windows服務ide
切換到代碼視圖修改.工具
using System; using System.IO; using System.ServiceProcess; namespace WindowsServiceTest { public partial class hjpServiceTest : ServiceBase { //定時器 System.Timers.Timer t = null; public hjpServiceTest() { InitializeComponent(); //啓用暫停恢復 base.CanPauseAndContinue = true; //每5秒執行一次 t = new System.Timers.Timer(5000); //設置是執行一次(false)仍是一直執行(true); t.AutoReset = true; //是否執行System.Timers.Timer.Elapsed事件; t.Enabled = true; //到達時間的時候執行事件(theout方法); t.Elapsed += new System.Timers.ElapsedEventHandler(theout); } //啓動服務執行 protected override void OnStart(string[] args) { string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "啓動"; WriteLog(state); } //中止服務執行 protected override void OnStop() { string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "中止"; WriteLog(state); } //恢復服務執行 protected override void OnContinue() { string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "繼續"; WriteLog(state); t.Start(); } //暫停服務執行 protected override void OnPause() { string state = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "暫停"; WriteLog(state); t.Stop(); } public void WriteLog(string str) { using (StreamWriter sw = File.AppendText(@"d:\service.txt")) { sw.WriteLine(str); sw.Flush(); } } public void theout(object source, System.Timers.ElapsedEventArgs e) { WriteLog("theout:" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss")); } } }
解釋:OnStart和OnStop分別是服務器啓動和中止後,所發生的事件操做方法.定義了一個定時器,每隔5秒執行一次(theout方法),由於暫停恢復功能默認是不啓用的,須要設置CanPauseAndContinue屬性啓用此功能,同時重寫OnStop和OnContinue方法,添加本身的邏輯代碼.spa
將服務程序hjpServiceTest.cs 切換到視圖模式,用鼠標右鍵單擊設計視圖選擇「添加安裝程序」選項,此後在項目中自動增長了一個ProjectInstaller.cs,操作系統
以下圖.net
打開ProjectInstaller,修改serviceInstaller1組件屬性命令行
Description= 個人服務備註 服務備註說明debug
DisplayName=個人服務 服務友好名字
ServiceName=hjpServiceTest 安裝服務器名字
StartType=Automatic 服務類型
ü Manual 服務安裝後,必須手動啓動。
ü Automatic 每次計算機從新啓動時,服務都會自動啓動。
ü Disabled 服務沒法啓動。
並設計serviceProcessInstaller1的屬性Account=LocalSystem
運行編譯,一個簡單的windows服務已經開發完成.
安裝window服務
安裝命令:InstallUtil.exe WindowsServiceTest.exe
InstallUtil存在路徑爲:C:\WINDOWS\Microsoft.NET\Framework\.NET版本號
複製C:\WINDOWS\Microsoft.Net\Framework\版本號 路徑中的InstallUtil.exe 到bin/debug或bin/release文件夾中,在命令行窗口中直接運行命令
InstallUtil.exe WindowsServiceTest.exe,在系統中註冊這個服務,使它創建一個合適的註冊項,以下圖:
而後再window服務列表中,啓動hjpServiceTest服務
卸載window 服務
命令:InstallUtil.exe WindowsServiceTest.exe /u
若是修改這個服務,可是路徑沒有變化的話是不須要從新註冊服務的,直接中止服務,而後用新的文件覆蓋原來的文件便可,若是路徑發生變化,應該先卸載這個服務,而後從新安裝這個服務。
------------------------------------------------------------------------------------------------------
Window服務應用程序體系結構
.net framework對windows服務提供了更多的支持,在命名空間System.ServiceProcess下.
包括類以下:
ServiceBase 全部Window服務的基類
ServiceController 該類的一個實例表明一個具體的windows服務
ServiceControllerPermission 用於控制ServiceController的使用權限
ServiceInstaller 用於執行對windows服務的安裝
ServiceProcessInstaller 用於執行對windows服務的安裝,與上類的不一樣的是,該類能夠表明一個能夠執行的windows服務的進程.
ServiceBase類
ServiceBase方法:
方法 |
描述 |
Run() |
運行一個windows服務 |
OnContinue() |
繼續執行服務 |
OnCustomCommand() |
向windows服務發出自定指令 |
OnPause() |
暫停正在運行的windows服務 |
OnPowerEvent() |
當計算機的電源狀態改變是調用 |
OnShutDown() |
當系統關閉條用OnStart()開始一個windows服務 |
OnStop() |
結束一個windows服務 |
ServiceBase屬性:
屬性 |
描述 |
AutoLog |
表示是否將開始,結束,暫停,繼續等指令寫入事件日誌 |
CanHandlePowerEvent |
表示該服務是否支持電源事件 |
CanPauseAndContinue |
表示該服務是否支持暫停和繼續功能 |
CanShutDown |
表示該服務是否支持關閉功能 |
CanStop |
表示該服務是否支持結構功能 |
EventLog |
應用程序的時間日誌 |
ServiceName |
該服務名稱 |
ServiceController類
服務控制類,用於控制windows服務的各類具體行爲,它既能夠控制本地的windows服務,有能夠控制遠程的windows服務。
ServiceControler的方法:
方法 |
描述 |
GetDivices() |
獲得一臺計算機上設備驅動器服務 |
GetServices() |
獲得一臺計算上的非設備驅動器服務 |
Close() |
用於斷開服務鏈接,而且釋放服務控制器所佔用的資源 |
Continue() |
繼續被暫停的服務 |
ExcuteCommand() |
對服務執行一條自定義命令 |
Pause() |
暫停服務 |
Refresh() |
對全部屬性更新 |
Start() |
啓動服務 |
Stop() |
中止服務 |
WaitForStatus() |
等待服務到達指定的狀態 |
ServiceController屬性
屬性 | 描述 |
CanPauseAndContinue | 表示服務是否能夠中止 |
CanShutDown | 表示服務在系統關閉時是否能夠獲得通知,CanStop表示服務器是否能夠被中止 |
DependentServices | 表示與服務相關聯的設備 |
DisplayName | 表示服務控制器所綁定的名稱 |
MachineName | 表示服務所在的計算機名稱 |
ServiceName | 表示綁定的服務名稱 |
ServiceType | 表示控制器所引用的服務類型 |
ServicesDependedOn | 表示服務所依賴ude服務集合Status表示控制器所引用的服務狀態 |
ServiceInstaller類
ServiceInstaller的屬性
屬性 | 描述 |
DisplayName | 顯示名稱 |
ServiceName | 表示服務名稱,這個名稱必須與Installer將要安裝的windows服務名稱相同 |
ServiceDependOn | 服務所要用到的其服務名稱的一個數組 |
StartType | 表示所安裝服務的啓動特性,能夠爲Automatic,Manual或Disable,默認爲Manual |
方法 | 事件 |
AfterInstaller() | 調用Install方法後發生 |
AfterRollback() | 調用Rollback後發生 |
AfterUninstall() | 調用Uninstall方法後發生 |
BeforeInstall() | 調用Install方法前發生 |
BeforeRollback() | 調用Rollback方法前發生 |
BeforeUninstall() | 調用Uninstall方法前發生 |
Committed() | 調用Commit方法後發生 |
Committing() | 調用Commit方法前發生 |
ServiceProcessInstaller類
用於安裝ServiceBase繼承的windows服務,它與一個可執行程序中的全部服務所作基本工做相同
ServiceProcessInstaller屬性
屬性 | 描述 |
Account | 運行服務的當前用戶帳號 |
HelpText | 在服務安裝選項中給出的幫助信息 |
Password | 運行服務的當前帳號密碼 |
UserName | 運行服務的當前帳號用戶名 |
------------------------------------------------------------------------------------------------------------------------
Windows服務調試
vs打開MySerivceLog項目
在管理工具-〉服務裏面啓動MyServiceLog服務
單擊vs的調試 -〉附加到進程,以下圖
在"可用進程「列表中,選中你要調式的服務的可執行文件名
單擊 」附加「按鈕,便可進入調試狀態
在timer1_Elapsed方法裏設置一個斷點,而後等它執行,服務執行到該處時候會自動啓動斷點。