与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