windows service編程

來源:互聯網
上載者:User

標籤: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編程

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.