熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

.NET下開發Windows 服務應用程序

2013-11-23 18:53:28  來源: Java核心技術 

  Windows 服務應用程序介紹
  Microsoft Windows 服務(即以前的 NT 服務)使您能夠創建在它們自己的 Windows 會話中可長時間運行的可執行應用程序這些服務可以在計算機啟動時自動啟動可以暫停和重新啟動而且不顯示任何用戶界面這使服務非常適合在服務器上使用或任何時候為了不影響在同一台計算機上工作的其他用戶需要長時間運行功能時使用還可以在不同於登錄用戶的特定用戶帳戶或默認計算機帳戶的安全上下文中運行服務
  
  創建 Windows 服務
  當創建服務時可以使用稱作 Windows 服務的 Visual Studio NET 項目模板此模板引用適當的類和命名空間設置從服務基類的繼承並重寫您可能要重寫的幾種方法從而自動為您完成大部分工作
  若要創建功能性服務必須至少
  
  設置 ServiceName 屬性
  為服務應用程序創建必需的安裝程序
  重寫 OnStart 和 OnStop 方法並為其指定代碼以自定義服務的行為方式
  在將安裝程序添加到應用程序之後下一步是創建安裝項目該項目將安裝已編譯的項目文件並運行安裝服務所需的安裝程序若要創建完整的安裝項目您必須將服務項目的輸出添加到該安裝項目然後添加自定義操作以安裝您的服務
  
  創建一個 Windows 服務項目
  在屬性窗口中設置服務的 ServiceName 屬性 (注意  ServiceName 屬性的值必須始終與安裝程序類中記錄的名稱匹配如果更改此屬性還必須更新安裝程序類中的 ServiceName 屬性
  設置下列所有屬性以確定服務的工作機制 屬性 設置
  CanStop True 表示服務將接受停止運行的請求false 表示禁止服務停止
  CanShutDown True 表示服務希望在運行它的計算機關閉時收到通知以便能夠調用 OnShutDown 過程
  CanPauseAndContinue True 表示服務將接受暫停或繼續運行的請求false 表示禁止服務暫停和繼續
  CanHandlePowerEvent True 表示該服務可以處理有關計算機電源狀態更改的通知false 表示禁止服務得到有關這些更改的通知
  AutoLog True 表示在服務執行操作時將信息項寫入應用程序的事件日志false 表示禁用此功能(注意  默認為 true
  
  注意  當 CanStop 或 CanPauseandContinue 設置為 false 時服務控制管理器將禁用停止暫停或繼續服務的相應菜單選項
  
  訪問代碼編輯器並為 OnStart 和 OnStop 過程填寫所需的處理
  重寫其他所有要為其定義功能的方法
  添加服務應用程序所必需的安裝程序
  通過從生成菜單中選擇生成解決方案來生成項目 (注意  不要通過按 F 鍵來運行項目不能以這種方式運行服務項目
  實例
  新建一個名為MyService的Windows服務項目將Servicecs及代碼裡的類名改為你想要的名字我這裡統一用MyService
  using SystemThreading;
  一個後台服務線程private Thread backThread=null;
  在構造函數裡實例化線程thisbackThread=new Thread(new ThreadStart(thisRunning));
  在類裡添加private void Running(){}方法一般要讓線程一直處於運行狀態來處理你給它安排的工作例如根據消息隊列裡的消息執行下載任務下載文件
  private void Running()
  {
  while(true)
  {
  //你的處理
  ThreadSleep(*);//例如讓線程休眠
  }
  }
  重寫線程的控制函數
  protected override void OnStart(string[] args)
  {
  thisbackThreadStart();
  }
  protected override void OnStop()
  {
  thisbackThreadAbort();
  }
  protected override void OnPause()
  {
  thisbackThreadSuspend();
  }
  protected override void OnContinue()
  {
  thisbackThreadResume();
  }
  同時你也可以根據需要按照上面表格所列的屬性進行設置
  
  在該項目上點右鍵選擇添加-添加類-安裝程序類取名Installcs
  在Installcs的視圖設計器裡為它添加ServiceInstall和ServiceProcessInstall控件可以為這個控件設置屬性例如可以在ServiceInstall的ServiceDependedOn屬性裡設置服務依賴
  
  生成解決方案下面介紹如何安裝服務
  
  安裝和卸載服務
  手動安裝服務
  
  訪問項目中的已編譯可執行文件所在的目錄
  用項目的輸出作為參數從命令行運行 InstallUtilexe在命令行中輸入下列代碼
  installutil yourprojectexe
  手動卸載服務
  
  用項目的輸出作為參數從命令行運行 InstallUtilexe在命令行中輸入下列代碼
  installutil /u yourprojectexe
  
  調試 Windows 服務應用程序
  由於服務必須從服務控制管理器的上下文中運行而不是從 Visual Studio NET 中運行因此調試服務不像調試其他 Visual Studio 應用程序類型那樣簡單若要調試服務必須首先啟動服務然後將一個調試器附加到正在運行服務的進程中然後可以使用 Visual Studio 的所有標准調試功能來調試應用程序
  
  警告  除非知道進程是什麼並且知道附加到進程或可能會取消進程所帶來的後果否則不要附加到進程例如如果附加到 WinLogon 進程然後停止調試系統就會暫停因為沒有 WinLogon系統無法運行
  
  只能將調試器附加到正在運行的服務附加進程會中斷服務的當前運行它並不真正終止或暫停服務的處理也就是說如果開始調試時服務正在運行則在進行調試時該服務從技術上說仍處於已啟動狀態但它的處理已掛起
  
  附加到服務的進程使您能夠調試大多數服務代碼但並非全部例如由於服務已經啟動因此不能用這種方法調試服務的 OnStart 方法中的代碼或調試用於加載服務的 Main 方法中的代碼解決此問題的一個方法是在唯一作用是幫助調試的服務應用程序中創建一個臨時服務可以將兩個服務都安裝上然後啟動此虛擬服務加載服務進程臨時服務啟動了進程後就可以使用 Visual Studio NET 中的調試菜單來附加到服務進程
  
  當附加該進程之後可以設置斷點並使用這些斷點來調試代碼當退出用於附加到該進程的對話框時實際上已處於調試模式您可以使用服務控制管理器開始停止暫停和繼續您的服務因此命中已設置的斷點調試成功後移除此虛擬服務
  
  注意  調試 OnStart 方法可能比較困難因為 Windows 服務管理器將所有嘗試啟動服務的時間限制在 秒內當調試 Windows 服務應用程序時服務與Windows 服務管理器進行交互服務管理器通過調用 OnStart 方法啟動服務然後花 秒時間等待 OnStart 方法返回如果在這段時間內方法沒有返回管理器將顯示一個服務無法啟動的錯誤如果在 OnStart 方法中放置一個斷點並且在 秒內不通過該斷點則管理器不會啟動服務
  
  調試服務
  安裝您的服務
  可從服務控制管理器服務器資源管理器或代碼啟動服務
  在 Visual Studio 中調試菜單中選擇進程 出現進程對話框
  單擊顯示系統進程
  在可用進程區域內單擊服務的進程然後單擊附加 (提示  此進程將與服務的可執行文件同名)出現附加到進程對話框
  選擇任意適當選項然後單擊確定關閉對話框 (注意  您現在已處於調試模式
  設置要在代碼中使用的任意斷點
  訪問服務控制管理器並操縱您的服務並發送停止暫停和繼續命令以命中您的斷點
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25932.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.