¿Reiniciar un servicio con servicios dependientes?

Comenzando con una csharp-example y teniendo debidamente en cuenta las preguntas SO relacionadas Reinicie los servicios de Windows desde C # y No se puede reiniciar un Servicio) y varias otras preguntas relacionadas con reiniciar solo un servicio, Me pregunto cuál es el mejor método para reiniciar un serviciocon servicios dependientes (p.ej.Message Queuing, en la queMessage Queuing Triggers depende oIIS, en la queFTP Publishing yWorld Wide Web Publishing depender). El complemento mmc hace esto automáticamente, pero el código no parece proporcionar la misma funcionalidad (al menos no tan fácilmente).

ocumentación de @MSDN para Stop dice "Si algún servicio depende de este servicio para su funcionamiento, se detendrá antes de que se detenga este servicio. La propiedad DependentServices contiene el conjunto de servicios que dependen de este", yDependentServices devuelve una variedad de servicios. AsumiendoStartService() yStopService() siga las convenciones descritas en los ejemplos y los mencionados anteriormente (excepto que aceptanServiceControllers yTimeSpans directamente), comencé con:

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

Pero, ¿y si las dependencias del servicio están anidadas (recursivas) o cíclicas (si eso es posible ...)? SiService A esdepende d porService B1 yService B2 yService C1 depende d Service B1, parece 'reiniciar'Service A por este método detendríaService C1 pero no lo reiniciaría ...

Para que esta imagen de ejemplo sea más clara, seguiré el modelo en el complemento mmc de servicios:

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

¿Hay una mejor manera de hacerlo, o tendría que intervenir recursivamente y detener cada servicio dependiente y luego reiniciarlos todos después de reiniciar el servicio principal?

Adicionalmente, serádependient pero actualmente se detuvo ¿los servicios se enumerarán en Servicios dependientes? Si es así, ¿no los reiniciaría de todos modos? Si es así, ¿deberíamos controlar eso también? Esto parece ponerse más y más desordenado ...

* Nota: me doy cuenta de latimeout no se está aplicando completamente correctamente aquí (el tiempo de espera total podría ser muchas veces más largo de lo esperado), pero por ahora ese no es el problema que me preocupa; si desea solucionarlo, está bien, pero no diga 'se acabó el tiempo de espera ...'

Actualizar Después de algunas pruebas preliminares, he descubierto (/ confirmado) los siguientes comportamientos:

Detener un servicio (por ejemplo,Service A) que otros servicios (por ejemplo,Service B1) dependerá detendrá los otros servicios (incluidas las dependencias "anidadas" comoService C1)DependentServices hac incluye servicios dependientes en todos los estados (en ejecución, detenido, etc.), y también incluye dependencias anidadas, es decir,Service_A.DependentServices contendría{Service B1, Service C1, Service B2} (en ese orden, comoC1 depende deB1).Iniciar un servicio que depende de otros (por ejemplo,Service B1 depende d Service A) también iniciará los servicios necesarios.

or lo tanto, el código anterior se puede simplificar (al menos en parte) para simplemente detener el servicio principal (que detendrá todos los servicios dependientes) y luego reiniciar los servicios más dependientes (por ejemplo,Service C1 yService B2) (o simplemente reiniciando "todos" los servicios dependientes; se omitirán los que ya se iniciaron), pero eso realmente retrasa momentáneamente el inicio del servicio principal hasta que una de las dependencias se queje, por lo que eso realmente no ayuda .

Mira por ahora como simplemente reiniciar todas las dependencias es la forma más simple, pero eso ignora (por ahora) la administración de servicios que ya están detenidos y tal ...

Respuestas a la pregunta(3)

Su respuesta a la pregunta