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 :

Implémentation d'un service à l'état démarré


Sujet :

C#

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Implémentation d'un service à l'état démarré
    Bonjour,

    Je souhaiterais installer un service qui, à l'état démarré, execute un bout de code à l'infini et ne s'arrête que quand on l'arrête manuellement.

    Comment je pourrais faire?

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    948
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 948
    Points : 1 111
    Points
    1 111
    Par défaut
    En quel langage voudrais tu le programmer?

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    En fait, j'ai déjà créer une solution de type (service Windows) avec C# qui permet de créer un service qui execute dans son OnStart une procédure stockée de SQL Server. Mais elle l'execute uniquement une seule fois et se met à l'état démarré alors que je souhaiterais que même à l'état démarré, cette même procédure s'execute chaque minute par exemple.

    Pour ce qui est du langage, en C# ou en C , C ++. Je sais pas lequel conviendrait le mieux..

    Il me semble qu'en C#, ca m'arrangerait plus.

    voila ma méthode OnStart
    protected override void OnStart(string[] args)

    {
    SqlCommand sqlCmd = new SqlCommand();
    sqlCmd.CommandText = "demarrer";

    SqlConnection MyConnection = new SqlConnection("server=(local);database=master;Trusted_Connection=yes;");

    MyConnection.Open();

    sqlCmd.Connection = MyConnection;
    sqlCmd.CommandType = CommandType.StoredProcedure;

    SqlDataAdapter da = new SqlDataAdapter(sqlCmd);

    DataTable dt = new DataTable("tbl");

    da.Fill(dt);


    sqlCmd.Dispose();
    MyConnection.Close();
    // TODO: Add start code here (if required) to start your service.
    }

    Voila ma méthode OnStop()

    protected override void OnStop()
    {


    SqlCommand sqlCmd = new SqlCommand();
    sqlCmd.CommandText = "arreter";

    SqlConnection MyConnection = new SqlConnection("server=(local);database=master;Trusted_Connection=yes;");

    MyConnection.Open();

    sqlCmd.Connection = MyConnection;
    sqlCmd.CommandType = CommandType.StoredProcedure;

    SqlDataAdapter da = new SqlDataAdapter(sqlCmd);

    DataTable dt = new DataTable("tbl");
    da.Fill(dt);

    sqlCmd.Dispose();
    MyConnection.Close();
    // TODO: Add tear-down code here (if required) to stop your service.

    }
    Voila ce qu'il y a dans le main
    static void Main()
    {
    // To run more than one service you have to add them here
    ServiceBase.Run(new ServiceBase[] { new AO() });

    }

    Je pense que c'est dans le main qu'il faut écrire une boucle après le "ServiceBase.Run(new ServiceBase[] { new AO() });"

    while (le service n'est pas terminé)
    {
    refaire exactement le même code que celui du OnStart()
    }

    Je sais pas si c'est une bonne idée ...
    Merci d'avance de votre aide

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    948
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 948
    Points : 1 111
    Points
    1 111
    Par défaut
    je pense qu'il faudrait faire un while autour de ton servicebase.run :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (le service n'est pas terminé)
    {
    ServiceBase.Run(new ServiceBase[] { new AO() });
    }
    executer un service = executer le onstart.

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Juillet 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    ça ne marche pas. :s
    Je pense plutôt que ServiceBase.Run c'est executer le OnStart et se mettre dans un état démarré. Or le service ne fait rien à l'état démarré, donc je pense qu'il n'atteint même pas l'instruction le while

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 499
    Points : 218
    Points
    218
    Par défaut
    Salut,

    je pense que l'idée du while est la bonne
    par contre, il faut le mettre dans une méthode à part...

    pourquoi ne pas lancer un évènement dans le OnStart et lever un flag 'EnCoursDExecution'
    et mettre le while(EnCoursDExecution) dans la méthode déclanchée par l'évènement

    dans le OnStop, il faudrait baisser le flag EnCoursDExecution
    et le service s'arrêterait...
    enfin, il y aurait peut être bien une ptite subtilité du genre attendre que la boucle while, donc la méthode d'exécution se termine avant de quitter le OnStop
    ce qui pourrait se faire avec un autre flag et une autre boucle d'attente
    ...

    enfin je sais pas si ça serait très propre...

  7. #7
    Membre confirmé Avatar de joKED
    Profil pro
    Imposteur en chef
    Inscrit en
    Février 2006
    Messages
    337
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Imposteur en chef

    Informations forums :
    Inscription : Février 2006
    Messages : 337
    Points : 458
    Points
    458
    Par défaut
    Dans tous les services windows que je fais, j'ai toujours un thread qui execute le travail.

    En gros, si tu mets un while dans ton onstart, ça fonctionnera, mais le service aura du mal à passer à l'état démarré, puisqu'il attend que tout le code présent dans le onstart soit exécuté. Si tu boucles à l'infini, le onstart sera jamais terminé...

    Donc, la plupart du temps, je fais un truc du genre :

    - Créer une méthode doJob() qui exécutera toute la logique de mon code. C'est dans celle ci que je mets ma boucle while.

    - Dans le onstart, créer un thread qui va executer ma méthode dojob.

    Comme ça, le service démarre tranquille, et fais ce qu'on lui demande.

    Et comme suggéré plus haut, tu te mets un petit flag que tu initialise à true dans le onstart pour indiquer qu'il faut bosser, et que tu passe à false dans le onstop pour indiquer qu'il faut arrêter de bosser.
    Tant va la cruche à l'eau qu'à la fin y'a plus d'eau.

Discussions similaires

  1. Implémentation d'un service REST simple en Java
    Par 84mickael dans le forum REST
    Réponses: 5
    Dernier message: 31/10/2010, 10h40
  2. [batch] [services windows] état service sur serveur distant
    Par Deadpool dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 16/03/2009, 17h50
  3. [Oracle 8i] Service Oracle ne démarre pas
    Par PSYcoZZ dans le forum Oracle
    Réponses: 0
    Dernier message: 17/11/2007, 12h10
  4. Service Tomcat6 ne démarre pas
    Par arnaudperfect dans le forum Tomcat et TomEE
    Réponses: 5
    Dernier message: 05/09/2007, 14h58
  5. Services Oracle ne démarre pas sans connexion réseau??
    Par dreamanoir dans le forum Oracle
    Réponses: 6
    Dernier message: 22/02/2005, 00h44

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