web-dev-qa-db-fra.com

délai de démarrage du service Windows

Existe-t-il un moyen de définir une valeur différente pour le délai de démarrage du service par service? Je peux le changer en utilisant la clé de registre ServicesPipeTimeout, mais c'est par machine ( http://support.Microsoft.com/kb/824344 ).

Pour le moment, la seule chose à laquelle j'ai pensé était de faire toutes les actions de démarrage chronophages dans un thread différent.

51
Meidan Alon

Il est recommandé de terminer le démarrage de votre service le plus rapidement possible. Donc, pendant l'état de démarrage , ne faites que ce dont vous avez absolument besoin pour reconnaître qu'il a démarré avec succès; et faites le reste plus tard. Si le démarrage est encore un processus long, utilisez périodiquement SetServiceStatus pour informer le service Control Manager que vous n'avez pas encore terminé, donc il n'expire pas votre service.

36
Rômulo Ceccon

Je suis d'accord avec Romulo pour terminer de commencer votre service dès que possible. Toutefois, si vous avez besoin de temps et que vous utilisez .NET Framework 2.0 ou version ultérieure, vous pouvez envisager la méthode ServiceBase.RequestAdditionalTime ().

http://msdn.Microsoft.com/en-us/library/system.serviceprocess.servicebase.requestadditionaltime.aspx

protected override void OnStart()
{
    this.RequestAdditionalTime(10000);
    // do your stuff
}
79
Hinek

Faites simplement des trucs chronophages dans un autre fil

   protected override void OnStart(string[] args)
    {
        var task = new Task(() =>
        {
            // Do stuff
        });
        base.OnStart(args);
        task.Start();
    }
4
LuckyLikey

J'ai également dû faire face à un service qui peut prendre quelques secondes/minutes pour bien démarrer. Lorsque le service démarre, il essaie de se connecter à un serveur SQL. Cependant, lorsque le serveur entier a été redémarré, mon service démarrait AVANT SQL Server. (Je connais la dépendance du service mais elle ne s'applique pas à ma situation pour une raison particulière ....). J'ai essayé de faire une boucle en essayant 10 fois de me connecter à SQL Server, mais Windows tuait mon service avant le 2e essai, en raison du délai d'attente.

Ma solution: J'ai ajouté un Timer dans le "onStart ()" de mon service. Ensuite, la méthode "onTick ()" du service essayait 10 fois de se connecter au serveur SQL (avec une attente de 30). Plus de timeout au démarrage.

Donc en gros,

  • Mon service démarre dans 5 secondes.
  • Une minuterie est lancée 10 secondes après le démarrage du service.
  • Le temporisateur essaie 10 fois [en attendant 30 secondes à chaque fois] de se connecter au serveur SQL.
  • S'il réussit, le temporisateur se désactivera sinon, (après 10 essais), j'arrête le service.

Notez la manière la plus élégante de résoudre le problème, mais peut-être qu'une partie de ma solution peut aider quiconque dans la même situation que moi,

1
Simon