2011-05-09 7 views
2

J'ai un service Windows. Dans la méthode OnStart, j'effectue certaines opérations et si l'une des opérations échoue, je souhaite que le service s'arrête. Dans le bloc Catch je suis en train d'écrire le code mentionné ci-dessous:erreur lors de l'arrêt du service Windows par programme

var srvc = new System.ServiceProcess.ServiceController("Scv1", "localhost"); 
srvc.Stop(); 
srvc.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Stopped); 

Il fait bien le travail, mais les fenêtres me montre une messagebox:

--------------------------- 
Services 
--------------------------- 
The xxx service on Local Computer started and then stopped. Some services stop automatically if they are not in use by other services or programs. 
--------------------------- 
OK 
--------------------------- 

que je fais quelque chose de mal ici? Comment puis-je supprimer le messagebox?

Répondre

0

J'ai créé un service de test de base en C#, l'ai installé sur Windows 7, puis j'ai essayé de le démarrer.

using System.ServiceProcess; 

public class MyService : ServiceBase 
{ 
    static void Main() 
    { 
    System.ServiceProcess.ServiceBase.Run(new MyService()); 
    } 

    protected override void OnStart(string[] args) 
    { 
    bool failed = true; 
    // Do stuff... 
    // Oops, we failed! Time to stop! 
    if(failed) { 
     base.Stop(); 
     return; 
    } 
    base.OnStart(args); 
    } 
} 

En cas d'échec, oui, je vois la boîte de message que vous décrivez. Cette boîte de message ne fait pas partie de votre service - la fenêtre Services le montre. Si vous deviez ouvrir une invite de commande administrateur et tapez la commande suivante:

net start Scv1 

Ensuite, vous voyez apparaître un message d'erreur à base de texte au lieu d'une boîte de message.

Dans les deux cas, vous exécutez un programme qui demande au SCM de démarrer votre service. Votre service n'a pas pu démarrer. Cet échec est rapporté au programme. Le programme a décidé d'afficher un message d'erreur pour informer l'utilisateur. C'est hors de votre contrôle.

+0

ça fait la même chose. arrête le service. problème est la boîte de message que Windows apparaît bcz je l'arrête par programmation. – Asdfg

+0

Oui, il fait la même chose, mais il le fait correctement! Je vous dis que la façon dont vous le faites n'est pas la bonne façon pour un service de s'arrêter par programme, et c'est peut-être la cause de votre problème de boîte de message. Mes services n'ont jamais mis en place une boîte de message comme vous le décrivez quand je les arrête en raison d'un échec au démarrage. Je ne sais pas comment fonctionne ServiceBase, mais dans un service natif, selon la façon dont vous avez défini l'état du service, l'envoi d'une commande stop via le SCM ne fonctionnerait même pas si le service n'acceptait pas les demandes d'arrêt externes. –

+0

Je ne comprends pas ce que vous dites. J'ai changé mon code et je tiens l'instance de mon service dans une variable statique. Comme Mon service hérite de System.ServiceProcess.ServiceBase, lorsque j'appelle Stop, il appelle ServiceBase.Stop parce qu'il en hérite. Il montre toujours la boîte de message. Qu'est-ce que Native Service? – Asdfg

0

Vous pouvez réellement vérifier le gestionnaire d'événements. Il vous intime l'erreur que vous avez faite dans le fichier de configuration. Une erreur de syntaxe dans le fichier de configuration sera la raison de ce type de boîte de message.

Questions connexes