9
votes

Quel est le délai d'attente pour commencer un service Windows?

J'ai déployé mon service Windows (en utilisant indépendamment classe d'installateurs et sc.exe), mais je reçois une erreur lorsque j'essaie de commencer:

---------------------------
Services
---------------------------
Could not start the MyName service on Local Computer.



Error 1053: The service did not respond to the start or control request in a timely fashion.


0 commentaires

4 Réponses :


13
votes

La manière habituelle de créer un service consiste à créer le code de démarrage créer un nouveau thread et exécutez votre service dans ce fil.

Le démarrage du service devrait être presque instantané - rien de plus que de reproduire un nouveau fil avec votre «vrai» travail dedans.

Si vous prenez plus de trois secondes, c'est un signe que vous faites le vrai travail dans votre fil principal et ne créez pas un séparé pour votre service.


4 commentaires

Cela suppose une conception médiocre où elle pourrait ne pas être présente. L'initialisation complexe peut prendre du temps supplémentaire et le message "Échec de réponse" alerte les utilisateurs à un démarrage échoué. Si l'échec est survenu dans un thread et que le service s'arrête en conséquence, la seule preuve visible (sans interface utilisateur de surveillance séparée) sera dans le journal des événements.


Il y a une raison pour laquelle il y a une limite de 3 secondes pour le démarrage. Il existe des moyens d'étendre ceci (demande demandaDditional ()), mais la recommandation est que les services devraient commencer rapidement, et / ou appuyer sur le travail dans un fil séparé et alerter de manière différente. Prendre beaucoup de temps pour le démarrage empêchera d'autres services de commencer rapidement, ce qui est une mauvaise conception, imo.


Cette conception est un peu bizarre - pourquoi ferais-je prétendre que mon service peut commencer en 3 secondes, quand elle échoue dans la 4ème seconde?


Je n'aurais aucun problème à demander 4 secondes pour commencer - mais j'aurais un problème avec un service qui a demandé 3 minutes pour commencer. Je désinstallerais ce logiciel, car il y avait à peu près beaucoup de temps de démarrage pour le système ...



16
votes

Dans votre classe de service, utilisez Servicebase.Requestadditionaltime () Dans votre méthode OnStart / OnStop: XXX


1 commentaires

C'est super utile. Merci.



2
votes

En ce qui concerne la question spécifique, le délai exact varie, mais est inférieur à 30 secondes. Vous pouvez contrôler le délai de démarrage par défaut pour un service via une clé de registre, vous pouvez voir comment faire ce ici < / a>.

Cependant, je suis d'accord avec beaucoup d'autres que je regarderais deux options possibles.

  1. Obtenez votre service démarré dès que possible, frayez un fil, etc.
  2. Si vous ne pouvez pas aller avec l'option une, vous pouvez utiliser DemandAdDditionditionaltime (). Assurez-vous simplement de faire cet appel tôt.

0 commentaires