標籤:ati 伺服器 serve exec 引用 管理 基本 manage count
1 基本概念
1.1windows服務簡介
建立在它們自己的 Windows 會話中可長時間啟動並執行可執行應用程式。 這些服務可以在電腦啟動時自動啟動,可以暫停和重新啟動而且不顯示任何使用者介面。
1.2適用情形
適合在伺服器上使用且不需要介面的,長時間穩定啟動並執行情形。
1.3
如何安裝及卸載服務
1)安裝
使用InstallUtil.exe命令,在命令提示字元工具中執行安裝命令。具體如下
首先,執行命令cd C:\Windows\Microsoft.NET\Framework\v4.0.30319
然後,執行InstallUtil.exe path
其中path為待安裝服務應用路徑。注意,windows server 2012 使用如下安裝命令:.\InstallUtil.exe path
2)卸載
InstallUtil.exe /u path
注意,windows server 2012 使用如下安裝命令:
.\InstallUtil.exe /u path
3) 如何管理服務
使用“服務控制管理員”啟動、停止、暫停、繼續和佈建服務,如所示:
2 建立服務
2.1四個方法
使用多線程啟動、停止、暫停、繼續
protected override void OnStart(string[] args):啟動
protected override void OnStop():停止
protected override void OnPause():暫停
protected override void OnContinue():繼續
2.2 添加安裝程式
第一步,雙擊中紅框位置。
第二步,在如下的頁面中,單擊右鍵。
彈出,點擊紅框位置
第三步,如下介面配置安裝程式。
下面兩個圖的參數含義為:
Account:賬戶類型。公有四種,入
成員名稱 |
說明 |
LocalService |
一個可用作本機電腦上的非特權使用者,並向任意遠程伺服器提供匿名憑據的帳戶。 |
LocalSystem |
一個帳戶,使用服務控制管理員,該本機電腦上擁有許多特權並作為網路上的電腦。 |
NetworkService |
提供多種本地特權,並提供給所有遠程伺服器的電腦的憑據的帳戶。 |
User |
定義特定使用者在網路上的帳戶。 指定 User 為 ServiceProcessInstaller.Account 成員會導致系統提示輸入有效使用者名稱和密碼時安裝了服務,除非您將值設定為 Username 和 Password 屬性您 ServiceProcessInstaller 執行個體。 |
DelayedAutoStart:該值指示服務是否應延遲之前運行其他自動啟動的服務無法啟動。true 對延遲自動啟動服務;否則為 false。 預設值為 false。
Description :解釋服務作用的簡短注釋。
DisplayName :識別服務的名稱。
ServiceName :系統用來標識此服務的名稱。
ServicesDependedOn :此服務依賴的服務。
StartType :如何以及何時啟動此服務。
成員名稱 |
說明 |
Automatic |
指示服務將由(或已由)作業系統在系統啟動時啟動。 如果一個自動啟動的服務依賴於手動啟動的服務,則該手動啟動的服務也會在系統啟動時自動啟動。 |
Disabled |
指示服務已禁用,因此無法由使用者或應用程式啟用。 |
Manual |
指示服務僅由使用者(使用服務控制管理員)或應用程式以手動方式啟動。 |
3 一些技巧
3.1 服務名稱配置化
獲得設定檔中配置的服務名稱,代碼如下:
public class ServiceNameSetting { /// <summary> /// 服務名稱 /// </summary> /// <returns></returns> public static string ServiceName { get { return GetAppConfigText(GetConfigPath("HYMDService.exe.config"), "ServiceName", "HYMDService"); } } /// <summary> /// 獲得設定檔路徑 /// </summary>/// <param name="appConfigName">應用程式設定檔名稱</param> /// <returns></returns> private static string GetConfigPath(string appConfigName) { string root = System.Reflection.Assembly.GetExecutingAssembly().Location; return root.Remove(root.LastIndexOf(‘\\‘) + 1) + appConfigName; } /// <summary> /// 獲得配置節下內容 /// </summary> /// <param name="configpath">應用程式設定檔路徑</param> /// <param name="strKeyName"><appSettings>配置節下add節點key屬性對應值</param> /// <param name="defaultName">預設服務名稱</param> /// <returns></returns> private static string GetAppConfigText(string configpath, string strKeyName, string defaultName) { if (!string.IsNullOrWhiteSpace(configpath) && !string.IsNullOrWhiteSpace(strKeyName)) { using (XmlTextReader tr = new XmlTextReader(configpath)) { while (tr.Read()) { if (tr.NodeType == XmlNodeType.Element) { if (tr.Name == "add" && tr.GetAttribute("key") == strKeyName) { return tr.GetAttribute("value"); } } } } } return defaultName; }}
注意:
上述代碼中不使用System.Configuration.ConfigurationManager.AppSettings[Key]讀取設定檔是因為,在程式剛啟動時此方式不能讀取設定檔,所以要用本文中使用的方法。
3.2 長任務暫停與繼續
思路:
在OnPause方法中將FlowController.IsToPause = true,表示服務應該暫停。在OnContinue方法中調用FlowController.Continue方法。
在代碼中,需要暫停位置調用FlowController.Pause,當點擊“暫停時候”,發出暫停命令,程式運行到FlowController.Pause方法時便停在此處。
Pause方法中使用AutoEvent.WaitOne()阻塞線程,直到收到訊號。
Continue方法中使用AutoEvent.Set()發出訊號,允許線程繼續執行。
流程式控制制器,代碼如下:
public class FlowController { public static bool IsToPause = false; public static AutoResetEvent AutoEvent = new AutoResetEvent(false); /// <summary> /// 暫停服務 /// </summary> public static void Pause(params) {//對參數params進行處理//記錄程式暫停了AutoEvent.WaitOne(); }/// <summary> /// 服務繼續 /// </summary> public static void Continue(params) {//對參數params進行處理//記錄程式繼續了 AutoEvent.Set(); IsToPause = false; } }
-----------------------------------------------------------------------------------------
轉載與引用請註明出處。
時間倉促,水平有限,如有不當之處,歡迎指正。
windows service編程