2010-05-17 6 views
6

J'ai une application qui s'exécute en tant que service Windows. Il stocke divers paramètres dans une base de données qui sont recherchés au démarrage du service. J'ai construit le service pour supporter différents types de bases de données (SQL Server, Oracle, MySQL, etc). Souvent, les utilisateurs finaux choisissent de configurer le logiciel pour utiliser SQL Server (ils peuvent simplement modifier un fichier de configuration avec la chaîne de connexion et redémarrer le service). Le problème est que lorsque leur ordinateur démarre, il arrive souvent que SQL Server soit démarré après mon service, de sorte que mon service a des erreurs au démarrage car il ne peut pas se connecter à la base de données. Je sais que je peux spécifier des dépendances pour mon service afin d'aider le gestionnaire de services Windows à démarrer les services appropriés avant le mien. Cependant, je ne sais pas de quels services dépendra au moment de l'installation (quand mon service est enregistré) puisque l'utilisateur peut changer de base de données plus tard. Donc, ma question est la suivante: y a-t-il un moyen pour l'utilisateur d'indiquer manuellement les dépendances du service en fonction de la base de données qu'il utilise? Si non, quelle est l'approche de conception appropriée que je devrais prendre? J'ai pensé à essayer de faire quelque chose comme attendre 30 secondes après le démarrage de mon service avant de me connecter à la base de données, mais cela semble vraiment floconneux pour diverses raisons. J'ai également considéré essayer de se connecter "paresseusement" à la base de données; le problème est que j'ai besoin d'une connexion immédiatement au démarrage, car la base de données contient diverses informations vitales dont mon service a besoin au démarrage. Des idées?Définir les dépendances de service après l'installation

Répondre

3

Dennis ce que vous cherchez est SC.exe. C'est un outil de ligne de commande que les utilisateurs peuvent utiliser pour configurer les services.

sc [Servername] Command Servicename [Optionname= Optionvalue...] 

plus specificly vous voulez utiliser

sc [ServerName] config ServiceName depend=servicetoDependOn 

Voici un lien sur les options de commandlike pour SC.EXE http://msdn.microsoft.com/en-us/library/ms810435.aspx

+1

Merci cela va certainement aider. Ce n'est pas tout à fait idéal car je dois maintenant demander à mes utilisateurs finaux d'exécuter cette commande, mais c'est mieux que rien. – Dennis

1

Une solution de code (loin d'être idéal):

Dans votre méthode de démarrage codez-le comme une boucle qui se termine lorsque vous avez une connexion. Ensuite, dans ce piège en boucle toute erreur de connexion de base de données et garder réessayant que le code pseudo suivant illustre:

bool connected = false; 
while (!connected) 
{ 
    try 
    { 
     connected = openDatabase(...); 
    } 
    catch (connection error) 
    { 
     // It might be worth waiting for some time here 
    } 
} 

Cela signifie que votre programme ne continue pas jusqu'à ce qu'il ait une connexion. Cependant, cela pourrait aussi signifier que votre programme ne sortira jamais de cette boucle, vous aurez donc besoin d'un moyen de le terminer - manuellement ou après un certain nombre d'essais.

Comme vous avez besoin que votre service démarre dans un délai raisonnable, ce code ne peut pas entrer dans l'initialisation principale. Vous devez faire en sorte que votre programme "démarre" avec succès, mais ne pas effectuer de traitement avant que cette méthode ne soit retournée connected = true. Vous pouvez y parvenir en mettant ce code dans un fil, puis en commençant votre code d'application réel sur l'événement "thread terminé".

+0

Je ne pense pas que cela aidera car le gestionnaire de services Windows attendra que mon service pour terminer son démarrage avant d'essayer de démarrer le prochain service ... – Dennis

+0

@Dennis - bon point. – ChrisF

0

Pas une réponse directe mettre quelques points que vous pouvez regarder dans

  1. service Windows peut être démarré automatiquement avec un retard. Vous pouvez vérifier cette question dans SO pour quelques informations à ce sujet.

How to make Windows Service start as “Automatic (Delayed Start)”

  1. Vérifiez ce poste How to: Code Service Dependencies
+0

Merci pour le lien de démarrage différé. Malheureusement, ce n'est disponible sur Vista et plus tard, donc cela ne fonctionnera pas pour mes utilisateurs qui utilisent XP et Server 2003. – Dennis

Questions connexes