與csharp-example並正式開始注意到與SO有關問題(Restart a windows services from C#和Cannot restart a Service)以及其他各種問題,重新啓動只是一個服務,我想知道,最好的方法是什麼重新啓動服務與相關服務 (例如Message Queuing
,其上Message Queuing Triggers
取決於,或者IIS
,其中FTP Publishing
和World Wide Web Publishing
取決於)。 mmc管理單元自動執行此操作,但代碼似乎沒有提供相同的功能(至少不那麼容易)。重新啓動具有相關服務的服務?
MSDN documentation for Stop說:「如果任何服務依賴於該服務爲他們的運營,他們將停止此服務被終止之前的DependentServices屬性包含一套依賴於這個服務的,」和DependentServices
返回一系列的服務。假設StartService()
和遵循的例子,並概述了公約,如上述(除非他們接受ServiceControllers
和TimeSpans
直接),我開始引用:
public static void RestartServiceWithDependents(ServiceController service, TimeSpan timeout)
{
ServiceController[] dependentServices = service.DependentServices;
RestartService(service, timeout); // will stop dependent services, see note below* about timeout...
foreach (ServiceController dependentService in dependentServices)
{
StartService(dependentService, timeout);
}
}
但是,如果該服務依賴關係嵌套(遞歸)或循環(如果這甚至有可能...) - 如果Service A
是取決於通過Service B1
和Service B2
和Service C1
取決於Service B1
,似乎「重新啓動」通過這種方法Service A
將停止Service C1
,但不會重新啓動它...
爲了使這個例子畫面更清晰,我會按照在服務MMC管理模式管理單元:
The following system components depend on [Service A]:
- Service B1
- Service C1
- Service B2
是否有更好的方法去這個,還是隻是遞歸地進入並停止每個依賴服務,然後在重啓主服務後重新啓動它們?
此外,將從屬於但目前停止服務將列在依賴服務?如果是這樣,反正他們不會重新啓動它們嗎?如果是這樣,我們是否應該控制它?這似乎變得更混亂和更混亂...
*注意:我意識到timeout
沒有被正確應用在這裏(總體超時可能比預期長很多倍),但現在不是這個問題我很擔心 - 如果你想修復它,但沒關係,只是不要說'超時'壞了......'
更新:經過一些初步測試,我發現(/確認)以下行爲:
- 停止服務(例如
Service A
)的其他服務(E 。G。Service B1
)取決於將停止其他服務(包括「嵌套」的依賴關係如Service C1
) DependentServices
確實包括在所有狀態相關的服務(運行,停止等),並且它也包括嵌套的依賴關係,即Service_A.DependentServices
將包含{Service B1, Service C1, Service B2}
(以該順序,因爲C1
取決於B1
)。- 啓動一項取決於他人的服務(例如
Service B1
取決於Service A
)也將啓動必要的服務。
的代碼因此上述可以被簡化(至少部分地)到剛停止主服務(這將停止所有相關服務),然後重新啓動最依賴的服務(例如Service C1
和Service B2
)(或只是重新啓動「所有」依賴服務 - 它會跳過已經啓動的服務),但這只是暫時延遲主服務的啓動,直到其中一個依賴項抱怨爲止,所以這並沒有什麼幫助。
看起來現在好像剛剛重新啓動所有的依賴是最簡單的方式,但忽略了(現在)管理那些已經停止服務,並且這樣的......
評論「他們以前的狀態是壓力在集合中出現「是無效的。當我執行此代碼時,狀態似乎已更新。所以我不得不修改它來記錄主服務重啓之前的初始狀態。也許.NET內部實現自發布後發生了變化? – Stif