Reiniciar um serviço com serviços dependentes?

Iniciando com um csharp-example e observando devidamente as questões SO relacionadas Reinicie serviços do Windows a partir de C # eNão é possível reiniciar um Serviço) e várias outras perguntas relacionadas arestarting apenas um serviço, Estou me perguntando qual é o melhor método para reiniciando um serviçocom serviços dependentes (por exemplo.Message Queuing, no qualMessage Queuing Triggers depende ouIIS, no qualFTP Publishing eWorld Wide Web Publishing depende). O snap-in mmc faz isso automaticamente, mas o código não parece fornecer a mesma funcionalidade (pelo menos não tão facilmente

ocumentação do @MSDN para Stop diz "Se algum serviço depender deste serviço para sua operação, ele será interrompido antes da interrupção do serviço. A propriedade DependentServices contém o conjunto de serviços que dependem deste" eDependentServices retorna uma matriz de serviços. AssumindoStartService() eStopService() siga as convenções descritas nos exemplos e acima mencionados (exceto que eles aceitamServiceControllers eTimeSpans diretamente), comecei com:

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);
    }
}

Mas e se as dependências de serviço forem aninhadas (recursivas) ou cíclicas (se isso é possível ...) - seService A édepended on porService B1 eService B2 eService C1 depende d Service B1, parece 'reiniciar'Service A por esse método parariaService C1 mas não o reiniciaria ...

Para tornar esta imagem mais clara, seguirei o modelo no snap-in mmc de serviços:

The following system components depend on [Service A]:
  - Service B1
    - Service C1
  - Service B2

Existe uma maneira melhor de fazer isso, ou seria necessário entrar e parar recursivamente cada serviço dependente e, em seguida, reiniciar todos eles após reiniciar o serviço principa

Adicionalmente, serádependent mas atualmente parado services estão listados em DependentServices? Se sim, isso não os reiniciaria de qualquer maneira? Nesse caso, devemos controlar isso também? Isso parece ficar cada vez mais bagunçado ...

* Nota: eu percebo otimeout não está sendo aplicado completamente corretamente aqui (o tempo limite geral pode ser muitas vezes maior que o esperado), mas por enquanto não é esse o problema que me preocupa - se você deseja corrigi-lo, tudo bem, mas não basta dizer 'tempo esgotado ...'

Atualizarpós alguns testes preliminares, descobri (/ confirmei) os seguintes comportamentos:

Parar um serviço (por exemplo,Service A) que outros serviços (por exemplo,Service B1) depende de interromperá os outros serviços (incluindo dependências "aninhadas", comoService C1)DependentServices fa incluem serviços dependentes em todos os estados (Em execução, Interrompido etc.) e também inclui dependências aninhadas, ou seja,Service_A.DependentServices conteria{Service B1, Service C1, Service B2} (nessa ordem, comoC1 depende deB1).Iniciar um serviço que depende de outras pessoas (por exemplo,Service B1 depende d Service A) também iniciará os serviços necessário

O código acima pode, portanto, ser simplificado (pelo menos em parte) para interromper o serviço principal (que interromperá todos os serviços dependentes) e reiniciar os serviços mais dependentes (por exemplo,Service C1 eService B2) (ou apenas reiniciar "todos" os serviços dependentes - ele ignorará os que já foram iniciados), mas isso realmente adia momentaneamente o início do serviço principal até que uma das dependências se queixe, então isso realmente não ajuda .

or enquanto, parece que apenas reiniciar todas as dependências é a maneira mais simples, mas isso ignora (por enquanto) o gerenciamento de serviços que já estão parados e .

questionAnswers(3)

yourAnswerToTheQuestion