Partager via


Services multithreads

Le gestionnaire de contrôle de service (SCM) contrôle un service en envoyant des événements de contrôle de service à la routine du gestionnaire de contrôle du service. Le service doit répondre aux événements de contrôle en temps opportun afin que le SCM puisse effectuer le suivi de l’état du service. En outre, l’état du service doit correspondre à la description de son état que le SCM reçoit.

En raison de ce mécanisme de communication entre un service et le SCM, vous devez être prudent lorsque vous utilisez plusieurs threads dans un service. Lorsqu’un service est invité à s’arrêter par le SCM, il doit attendre que tous les threads se terminent avant de signaler au SCM que le service est arrêté. Sinon, le SCM peut devenir confus quant à l’état du service et peut ne pas s’arrêter correctement.

Le SCM doit être averti que le service répond à l’événement d’arrêt de contrôle et que la progression est en cours d’arrêt du service. Le SCM suppose que le service progresse si le service répond (via SetServiceStatus) dans le délai (indicateur d’attente) spécifié dans l’appel précédent à SetServiceStatus, et que le point de case activée est mis à jour pour être supérieur au point de contrôle spécifié dans l’appel précédent à SetServiceStatus.

Si le service signale au SCM que le service s’est arrêté avant la fermeture de tous les threads, il est possible que le SCM interprète cela comme une contradiction. Cela peut entraîner un état dans lequel le service ne peut pas être arrêté ou redémarré.