簡體   English   中英

與Windows服務相同的應用程序的多個實例?

[英]Multiple Instances of same Application as a Windows Service?

我有一個應用程序來管理我的項目的繁重處理,並需要將其轉換為“Windows服務”。 我需要允許運行應用程序處理的多個 版本 實例,這似乎是一個相當正常的要求。

我可以看到至少三種方法來做到這一點:

  1. 創建一個已安裝的目錄(EXE,DLL,config),但要從中安裝多個Services實例。
  2. 啟動后,讓一個Services實例生成多個自身實例,即Apache。
  3. 讓一個Services實例生成多個在同一進程空間內工作的線程。

我的意圖是方法#1,但我一直在設計和特別是服務文檔的限制上絆倒:

  • 參數是否通過無人值守系統上的常規服務機制傳遞給OnStart() 如果是的話,何時/為何?
  • 通過ImageKey注冊表傳遞運行時參數似乎是一個問題,是否有更好的機制?
  • 我得到了應用程序安裝/卸載自身作為一對服務(“XYZ#1”,“XYZ#2”,...),使用ImageKey將命令行參數實例編號(“-x 1”) ,“ - x 2”)但我遺失了一些東西。 嘗試啟動該服務時,它將失敗,“ 此服務配置為運行的可執行程序未實現該服務

所以,問題:

  1. 是否有關於服務啟動時會發生什么的簡明描述,特別是對於ServiceName未進行硬編碼的情況(參見上面的Q)。
  2. 有沒有人成功使用方法#1? 任何意見?

注意:我通過使用方法#3來解決這個問題,所以我無法證明這一點。 但我認為有人可能有關於如何實施#1的信息 - 或者很好的理由為什么它不是一個好主意。

[編輯]我最初有一個第四個選項( 在硬盤上安裝應用程序的多個副本 ),但我刪除它,因為它只是感覺,嗯,hackish。 這就是我說“ 至少有三種方法 ”的原因。

但是,除非重新編譯應用程序,否則它必須動態設置其ServiceName,因此它具有上述第三個項目符號/問題的解決方案。 因此,除非需要更改其安裝文件的實例,否則#1應該可以正常使用目錄中的N個配置文件和指示實例應該使用的注冊表項。

雖然我無法回答您對選項#1的具體問題,但我可以告訴您選項#2對我們來說非常有效。 我們希望為每個“子”服務創建一個應用程序域,以便在每個“子”服務下運行並為每個子服務使用不同的配置文件。 在我們的服務配置文件中,我們存儲了要啟動的應用程序域以及要使用的配置文件。 因此,對於每個條目,我們只需創建應用程序域,設置配置文件等,然后關閉。 這種配置分離使我們能夠輕松地為每個實例唯一地指定端口和日志文件位置。 我們的另一個好處是我們將“子服務”編寫為命令行exe,並在每個“子”服務的新線程上簡單地調用AppDomain的ExecuteAssembly()。 解決方案中唯一的“笨拙”是關閉,我們沒有打算為它創建一個“好”的解決方案。

2012年2月更新

前段時間我們開始使用“命名”服務(如SQL Server)。 我在博客的“構建Windows服務 - 第1 部分第7部分 ”系列中詳細介紹了整個過程。 它們將指導您完成自行安裝的命令行/ Windows服務混合。 滿足以下目標:

  • 構建也可以從控制台使用的服務
  • 正確記錄服務啟動/關閉和其他活動的事件
  • 通過使用命令行參數允許多個實例
  • 自行安裝服務和事件日志
  • 正確記錄服務異常和錯誤的事件
  • 控制啟動,關閉和重啟選項
  • 處理自定義服務命令,電源和會話事件
  • 自定義服務安全性和訪問控制

構建Windows服務 - 第7部分:完成觸摸系列的最后一篇文章中提供了完整的Visual Studio項目模板。

看看這個: 多實例.NET Windows服務

有一個選項#4,我在我的項目中成功使用了“命名實例”。

您應用的每次安裝都有自定義名稱,每個安裝都有自己的服務。 它們是完全獨立的並且彼此隔離。 如果您嘗試在單台計算機上多次安裝它,MS SQL Server將使用此模型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM