Question

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

Pour le moment, la seule chose à laquelle je pensais était de faire toutes les actions de démarrage fastidieuses dans un autre thread.

Était-ce utile?

La solution

Il est judicieux de terminer le service le plus rapidement possible. Ainsi, pendant l'état start , ne faites que ce dont vous avez absolument besoin pour reconnaître que le processus a bien démarré. et faire le reste plus tard. Si le démarrage est encore un processus long, utilisez SetServiceStatus pour informer périodiquement le Gestionnaire de contrôle des services que vous n'avez pas encore terminé, afin qu'il n'expédie pas votre service.

Autres conseils

Je suis d’accord avec Romulo pour finir de commencer votre service le plus tôt possible. Toutefois, si vous avez besoin de temps et que vous utilisez .NET Framework 2.0 ou une 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
}

Faites simplement des trucs qui prennent beaucoup de temps dans un autre thread

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

J'ai également eu affaire à un service qui peut prendre quelques secondes / minutes pour avoir un bon départ. Lorsque le service démarre, il essaie de se connecter à un serveur SQL. Cependant, lorsque le serveur entier a été redémarré, mon service a démarré AVANT SQL Server. (Je connais la dépendance au service mais cela 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 était en train de tuer mon service avant le deuxième essai, à cause du délai d'attente.

Ma solution : j'ai ajouté un minuteur dans le répertoire "onStart ()". de mon service. Ensuite, le "onTick ()" méthode du service essayait 10 fois de se connecter à SQL Server (avec une attente de 30). Plus de délai au démarrage.

Donc en gros,

  • Mon service commence dans 5 secondes.
  • Une minuterie est lancée 10 secondes après la fin du service. commencé.
  • La minuterie tente 10 fois [d'attendre 30 secondes à chaque fois] de se connecter au serveur SQL.
  • Si cela réussit, le chronomètre se désactivera. Sinon, j'arrête le service (après 10 essais).

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top