A partir d'une csharp-example et en prenant dûment note des questions liées SO (Restart a windows services from C# et Cannot restart a Service) et diverses autres questions relatives à redémarrant seul service, je me demande quelle est la meilleure méthode est pour redémarrer un service avec les services dépendants (par exemple Message Queuing
, sur lequel dépend, ou IIS
, sur lequel FTP Publishing
et World Wide Web Publishing
dépendent). Le composant logiciel enfichable mmc le fait automatiquement, mais le code ne semble pas offrir la même fonctionnalité (du moins pas aussi facilement). «Si des services dépendent de ce service pour leur fonctionnement, ils seront arrêtés avant que ce service ne soit arrêté La propriété DependentServices contient l'ensemble des services qui en dépendent,» et DependentServices
renvoie un tableau de services . En supposant StartService()
et StopService()
suivre les conventions décrites dans les exemples et comme mentionné ci-dessus (à l'exception qu'ils acceptent ServiceControllers
et TimeSpans
directement), j'ai commencé avec:Redémarrer un service avec des services dépendants?
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);
}
}
Mais si les dépendances de service sont imbriquées (récursive) ou cyclique (si c'est même possible ...) - si Service A
est dépendait par Service B1
et Service B2
et Service C1
dépend deService B1
, il semble « redémarrer » Service A
par cette méthode arrêterait Service C1
mais ne le redémarrer ...
Pour rendre cet exemple image plus claire, je vais suivre le modèle dans les services composant logiciel enfichable MMC:
The following system components depend on [Service A]:
- Service B1
- Service C1
- Service B2
Y at-il une meilleure façon de s'y prendre ceci, ou devrait-il juste récursivement intervenir dans et arrêter chaque service dépendant et puis les relancer tous après qu'il redémarre le service principal?
De plus, sera dépendante mais actuellement arrêté services sont répertoriés sous DependentServices? Si oui, cela ne les relancerait-il pas? Si oui, devrions-nous contrôler cela aussi? Cela semble juste plus désordonné et plus désordonné ...
* Note: Je me rends compte que le timeout
n'est pas complètement appliqué correctement ici (le délai d'attente global pourrait être plusieurs fois plus long que prévu), mais pour l'instant ce n'est pas le problème Je suis préoccupé par - si vous voulez le réparer, bien, mais ne dites pas simplement 'timeout est cassé ...'
Mise à jour: Après quelques tests préliminaires, j'ai découvert (/ confirmé) le comportements suivants:
- arrêt d'un service (par exemple
Service A
) que d'autres services (e .g.Service B1
) dépendent arrêtera les autres services (y compris les dépendances « imbriquées », commeService C1
) DependentServices
ne comprennent les services dépendants dans tous les états (marche, arrêt, etc.), et il comprend également des dépendances imbriquées, à savoirService_A.DependentServices
contiendrait{Service B1, Service C1, Service B2}
(dans cet ordre,C1
dépend deB1
). Le démarrage d'un service dépendant d'autres services (par exemple,Service B1
dépend deService A
) lancera également les services requis.
Le code ci-dessus peut donc être simplifiée (au moins en partie) juste arrêter le service principal (qui arrêtera tous les services dépendants), puis en redémarrant les services les plus dépendants (par exemple Service C1
et Service B2
) (ou tout simplement redémarrer "tous" les services dépendants - il ignorera ceux déjà commencés), mais cela ne fait que retarder le démarrage du service principal jusqu'à ce que l'une des dépendances s'en plaigne, cela n'aide donc pas vraiment.
Attend pour l'instant comme juste de redémarrer toutes les dépendances est la façon la plus simple, mais qui ne tient pas compte (pour l'instant) la gestion des services qui sont déjà arrêté et comme ...
Le commentaire "leur état précédent est pres erved dans la collection "n'est pas valide. Le statut semblait être mis à jour lorsque j'exécutais ce code. J'ai donc dû le modifier pour enregistrer l'état initial avant le redémarrage du service principal. Peut-être que la mise en œuvre interne de .NET a changé depuis sa publication? – Stif