IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Arrêter un service proprement


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    Par défaut Arrêter un service proprement
    Bonjour à tous,


    J'ai créé un service windows de déplacement de fichier et créé un installer avec WIX. Tout fonctionne parfaitement excepté l'arrêt du service en cas d'erreur.

    Ma gestion des erreurs appelle la procédure suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    private void StopError()
            {
     
                Library.WriteErrorLog("le Service MoveFiles est stoppé");
     
                using (System.ServiceProcess.ServiceController serviceController = new System.ServiceProcess.ServiceController("MoveQCFiles"))
                {
                    serviceController.Stop();
                    //serviceController.WaitForStatus(ServiceControllerStatus.Stopped);
                }
     
            }
    Mais cela ne fonctionne pas. J'ai bien le message "Le service MoveFiles est stoppé" dans mon fichier de log mais le service ne s'arrête pas...
    Pour info, j'ai testé aussi:
    - this.onstop ();
    - this.stop();

    J'appelle StopError de cette façon par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    private void VerifFolder()
            {
                NetworkShare.ConnectToShare(@"" + SourcePath, SourceLogin, SourcePassword);
                    if (!Directory.Exists(SourcePath))
                    {
                        Library.WriteErrorLog("Service Erreur: Le dossier Source " + SourcePath + " n'existe pas");
                        StopError();
     
                    }
                NetworkShare.DisconnectFromShare(@"" + SourcePath, false);
     
                    if (!Directory.Exists(DestPath))
                    {
                        Library.WriteErrorLog("Service Erreur: Le dossier de destination " + DestPath + " n'existe pas");
                        StopError();
                    }                        
            }
    Le service s'initialise ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
     public Service1()
            {
                this.ServiceName = "MoveQCFiles";
                this.CanPauseAndContinue = false;
                this.CanStop = true;
                this.CanShutdown = true;
     
                InitializeComponent();
     
            }
     
            protected override void OnStart(string[] args)
            {
                // verification presence fichier config.xml
                VerifAppConfig();
               // ect...
            }
    De plus j'ai un second problème qui découlle du premier. J'ai créé un installer qui installe le service en lancement automatique et qui le démarre directement. Du coup si les dossiers correspondant à SourcePath et DestPath n'existe pas, l'installation tourne en boucle et fini pas planter.

    Comment faire pour créer un installer qui paramètre un demarrage automatique du service mais qui ne le lance pas à l'installation?

    Merci pour votre aide

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 41
    Points : 30
    Points
    30
    Par défaut
    Je pense pouvoir t'aider pour la deuxième partie de ton problème.

    D'après ce que tu décris, ton setup est un ClickOnce ?
    Si c'est le cas, c'est normal qu'il te lance l'install à chaque fois, c'est un composant utilisé pour les applis web en général mais pour les applis bureau c'est pas le top vu qu'il fait l'installation à chaque fois que tu le lances..
    Il te suffirait de créer un nouveau projet Visual Studio Installer qui te créera un setup windows à partir de la sortie principale de ton appli. (Si tu ne peux pas créer ce type de projet c'est que ton VS n'a pas l'extension pour les setup, tu peux la télécharger ici : https://marketplace.visualstudio.com...tallerProjects)
    Il te suffira de l'installer sur ton pc et de le mettre au démarrage comme tu ferais avec n'mporte quel autre programme/service.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    Par défaut
    salut

    euh je crois pas que ce soit un installer ClicOnce. C'est un setup WIX standard ("A project for creating a Windows Installer XML based MSI file").

  4. #4
    Membre confirmé
    Avatar de nouanda
    Homme Profil pro
    Hobbyist
    Inscrit en
    Mai 2002
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Activité : Hobbyist

    Informations forums :
    Inscription : Mai 2002
    Messages : 246
    Points : 627
    Points
    627
    Par défaut
    Bonjour,

    1 - n'écris pas dans le log AVANT d'être sûr que ce que tu fais a fonctionné. Tu risques de logger de fausses infos.
    2 - dans ta méthode StopError(), tu crées un nouveau serviceController que tu fermes aussitôt. Mais tu n'agis jamais sur rien d'autre.
    3 - tu as essayé this.Stop(), mais toujours dans le contexte du using? Si c'est le cas, this renvoie au service nouvellement créé, donc tu n'es pas dans le bon contexte.
    (et 4 - éventuellement, ce ne serait pas plus lisible d'appeler ta méthode StopOnError?)
    " Entre le Savoir et le Pouvoir, il y a le Vouloir "

    Desole pour les accents, je suis en QWERTY...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 362
    Points : 64
    Points
    64
    Par défaut
    Bonjour Nouanda,

    Oui tu as raison je vais modifier mon code pour écrire dans le log après l'action. Je vais également renommer ma méthode en StopOnError comme tu le recommandes.

    Ma methode StopOnerror est appelée dans le cadre de Try/catch (en plusieurs point sensible du code: verif presence dossier, reussite copie fichier).

    Pour le this.stop(), je l'ai testé en appel direct dans ma methode StopOnError (sans using donc).

    Pour l'histoire du serviceController, je ne le maîtrise pas du tout. J'ai trouvé un exemple sur le net que j'ai essayé d'adapter à mon cas. Peux-tu m'indiquer la bonne façon de procéder?

    A l'avance merci

  6. #6
    Membre confirmé
    Avatar de nouanda
    Homme Profil pro
    Hobbyist
    Inscrit en
    Mai 2002
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Activité : Hobbyist

    Informations forums :
    Inscription : Mai 2002
    Messages : 246
    Points : 627
    Points
    627
    Par défaut
    Alors franchement, je n'ai jamais travaillé avec des services...
    Mais ce que tu peux essayer, c'est de passer le ServiceController à arrêter en paramètre de ta méthode StopOnError():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    private void StopOnError(System.ServiceProcess.ServiceController serviceController)
        {
            try{
                serviceController.Stop();
                Library.WriteErrorLog("le Service MoveFiles est stoppé");
            }
            catch(Win32Exception	win32ex){
                // en cas d'exception
            }
            catch(InvalidOperationException invopex){
                // en cas d'exception
            }
        }
    Si tu connais l'objet ServiceController que tu dois fermer, tu appelles la méthode avec le bon objet. Si tu ne le connais pas, un debug pas-à-pas t'aidera à le trouver.
    " Entre le Savoir et le Pouvoir, il y a le Vouloir "

    Desole pour les accents, je suis en QWERTY...

Discussions similaires

  1. Comment arrêter le service IIS sur Vista ?
    Par zanoubia_iso dans le forum IIS
    Réponses: 1
    Dernier message: 09/06/2008, 14h34
  2. arrêter un service linux
    Par Methode dans le forum Administration système
    Réponses: 6
    Dernier message: 14/02/2008, 15h11
  3. comment arrêter un update proprement
    Par youxx dans le forum Oracle
    Réponses: 2
    Dernier message: 14/05/2007, 16h59
  4. Arrêter un service Windows XP et le redémarrer chaque matin
    Par beegees dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 30/09/2005, 11h25
  5. Démarrer et arrêter un service windows
    Par dvarrel dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 28/05/2005, 22h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo