2010-04-21 1 views
24

C'est ce que je suis:Quelle est la bonne façon de quitter Windows Service OnStart si la configuration est incorrecte et que rien à faire?

protected override void OnStart(string[] args) 
{ 
    if (SomeApp.Initialize()) 
    { 
     SomeApp.StartMonitorAndWork(); 
     base.OnStart(args); 
    } 
} 

protected override void OnStop() 
{ 
    SomeApp.TearDown(); 
    base.OnStop(); 
} 

Ici Initialiser lit un fichier de configuration et si elle est mal il n'y a rien à faire le service devrait cesser! Si la configuration est correcte, StartMonitorAndWork démarre:

Timer(new TimerCallback(DoWork), null, startTime, loopTime); 

et DoWork interroge périodiquement la base de données.

Si Initialiser échoue (je vérifie le fichier journal) et je tente d'arrêter le service de Outils- administratif> Services que je reçois:

 
Could not stop the SomeService on Local Computer. The service did not return an error. 
This could be internal Windows error or an internal service error. 
If the problem persists, contact system administrator. 
 
The question is: 
"Is exiting OnStart without doing nothing enough if Initialize returns false? 

ou devrait-il y avoir quelque chose comme ceci:

private void ExitService() 
{ 
    this.OnStop(); 
    System.Environment.Exit(1); 
} 

protected override void OnStart(string[] args) 
{ 
    if (ObjectFolderApp.Initialize()) 
    { 
     SomeApp.StartMonitorAndWork(); 
     base.OnStart(args); 
    } 
    else 
    { 
     ExitService(); 
    } 
} 

Merci & BR - Matti

EDIT: Je suis venu avec quelque chose comme ceci:

protected override void OnStart(string[] args) 
{ 
    try 
    { 
     if (SomeApp.Initialize()) 
     { 
      SomeApp.StartMonitorAndWork(); 
      base.OnStart(args); 
     } 
     else 
     { 
      Stop(); 
     } 
    } 
    catch 
    { 
     Stop(); 
    } 
} 

protected override void OnStop() 
{ 
    try 
    { 
     SomeApp.TearDown(); 
     base.OnStop(); 
    } 
    catch 
    { 
     base.OnStop(); 
    } 
} 
+1

Il y a une meilleure réponse de l'OMI - [? Quelle est la bonne façon pour un service Windows à l'échec] (http://stackoverflow.com/a/4197271/298054). – jweyrich

Répondre

2

je serais enregistrer une erreur au journal des événements si Initialize() faux rapports avec un certain message sensé dire alors qu'il échoue, et vous devriez que vous suggérez appeler OnStop() si elle échoue. C'est une bonne pratique d'assurer une fermeture correcte du service.

Voir aussi this related SO question et dev newsgroup thread.

+1

merci, désolé mais je n'ai pas compris. Pouvez-vous expliquer plus: "eturns faux avec un message sensible disant alors qu'il échoue, et vous devriez vous suggérer d'appeler OnStop()" –

+0

ok. Maintenant, je reçois une partie si Initialize retourne false, je devrais appeler OnStop. Qu'en est-il de System.Environment.Exit (1); ?? –

+0

L'appel de Enviroment.Exit() après l'arrêt OnStop est parfaitement correct. Cela enverra une erreur à votre service. S'il est configuré pour réessayer, l'envoi d'un message de sortie lui permettra de réessayer. La sortie est également préférée à FailFast sauf si vous avez un état corrompu dans votre application qui ne peut pas être réparé. –

6

après avoir testé toutes les approches, je préfère appeler

Environment.FailFast("Configuration is wrong."); 

objectif principal est que l'explication est l'échec écrit dans le journal des événements et FailFast affecte les paramètres de récupération de votre service. Donc, si vous configurez la récupération et que la configuration est correcte, votre service démarrera automatiquement.

+1

effectivement certaines personnes suggèrent d'appeler Stop. ceci devient OnStop à appeler. –

+0

@matti: J'ai trouvé qu'appeler Stop() empêchera le service d'exécuter les actions de récupération. – Marcel

3

Je sais que ce n'est pas joli mais lancer une exception dans OnStart fonctionne également. Si votre service est configuré sur "Autolog", votre message d'exception sera automatiquement écrit dans EventLog.

protected override void OnStart(string[] args) 
{ 
    if (ObjectFolderApp.Initialize()) 
    { 
     SomeApp.StartMonitorAndWork(); 
     base.OnStart(args); 
    } 
    else 
    { 
     throw new Exception("What went wrong"); 
    } 
} 
Questions connexes