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 :

timer dans un service windows


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de yochima
    Profil pro
    Inscrit en
    Août 2009
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 93
    Par défaut timer dans un service windows
    bonjour,
    me revoila parmis vous pour un nouveau probleme.

    je cherche a executer du code toute les 5 secondes a l'aide d'un service.

    voila ma syntaxe :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    static void Main()
    		{
    			System.ServiceProcess.ServiceBase[] ServicesToRun;
    			ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MonService() };
    			System.ServiceProcess.ServiceBase.Run(ServicesToRun);
     
     
     
                 timer.Tick += new EventHandler(TimerEventProcessor);
                // Sets the timer interval to 5 seconds.
                timer.Interval = 5000;
                timer.Start();
     
                while (exitFlag == false)
                {
                    // Processes all the events in the queue.
                    Application.DoEvents();
                }
    }
     
    protected override void OnStart(string[] args)
    {
    			// Code lancé au demarrage du service
                timer.Enabled = true;
     
    }
     
    private static void TimerEventProcessor(Object myObject, EventArgs myEventArgs)
            {
                timer.Stop();
                // mon code (qui fonctionne)
               timer.Enabled = true;
    }
    j'ai fait cette syntaxe a l'aide du msdn. mon soucis est que je rentre dans mon main seulement si j'arrete le service (vous comprendrez que ça n'ai pas tres utile).


    Comment dois-je faire pour accéder au Main avec mon OnStart?

    J'ai aussi essayé de mettre mon timer dans mon OnStart mais dans ce cas là le service met un temps infinie a démarrer (ce qui est normale vu que j'ai une boucle infinie).

    Il faut absolument que j'arrive a demarrer mon service, et a lui dire de rentrer dans mon Main. Par la suite le service tournera 100% du temps a l'aide de cette boucle infinie. (c'est pas propre mais c'est pour vous simplifier l'exemple)

    Merci d'avance

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2007
    Messages
    497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 497
    Par défaut
    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
    19
    20
    21
    22
    23
    24
    25
     timer.Tick += new EventHandler(TimerEventProcessor);
                // Sets the timer interval to 5 seconds.
                timer.Interval = 5000;
                timer.Start();
     
                while (exitFlag == false)
                {
                    // Processes all the events in the queue.
                    Application.DoEvents();
                }
    }
     
    protected override void OnStart(string[] args)
    {
    			// Code lancé au demarrage du service
                timer.Enabled = true;
     
    }
     
    private static void TimerEventProcessor(Object myObject, EventArgs myEventArgs)
            {
                timer.Stop();
                // mon code (qui fonctionne)
               timer.Enabled = true;
    }
    ne doit pas etre dans ton main mais dans "MonService.cs"

    que tu appelles la
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    			ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MonService() };

  3. #3
    Membre confirmé Avatar de yochima
    Profil pro
    Inscrit en
    Août 2009
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 93
    Par défaut
    effectivement, j'ai une methode MonService() dans MonService.cs
    est-ce bien de ça dont tu parles?
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    public MonService()
    		{
    			InitializeComponent();
     
                timer.Tick += new EventHandler(TimerEventProcessor);
     
                // Sets the timer interval to 5 seconds.
                timer.Interval = 5000;
                timer.Start();
     
     
                while (exitFlag == false)
                {
                    // Processes all the events in the queue.
                    Application.DoEvents();
                }
     
    			//Ici le nom doit etre identique à celui donné plus haut ! 
    			ServiceName = "MonServiceWindowsCSHARP";
    		}
     
    static void Main()
    		{
    			System.ServiceProcess.ServiceBase[] ServicesToRun;
    			ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MonService() };
    			System.ServiceProcess.ServiceBase.Run(ServicesToRun);
     
    		}
     
    private static void TimerEventProcessor(Object myObject, EventArgs myEventArgs)
            {
                timer.Stop();
    // mon code (qui fonctionne)
               timer.Enabled = true;
    }
     
     
    protected override void OnStart(string[] args)
    {
    			// Code lancé au demarrage du service
                timer.Enabled = true;
     
    }
    en faisant ce code là, j'ai de nouveau eu ma boucle infinie mais en plus de ça, le service est inarétable. sc delete MonServiceWindowsCSHARP me dit :
    Le service spécifié a été marqué pour suppression
    je ne pas pas faire arreter dans le gestionnaire de taches tout comme dans gestion de l'ordinateur.

    dernier recours qui marche : "redemarrer l'ordi"
    Dsl mais c'était pas la bonne méthode ^^
    Par contre j'ai bien rigolé parce que je me suis retrouvé avec 160 000 lignes dans ma base de donnée :p

    Une autre suggestion?
    PS : dsl si j'ai mal compris ce que tu m'as expliqué

  4. #4
    Membre éclairé Avatar de Johann7751
    Profil pro
    Analyste Programmeur Junior
    Inscrit en
    Février 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Analyste Programmeur Junior

    Informations forums :
    Inscription : Février 2009
    Messages : 234
    Par défaut
    Pour implementer un timer dans ton service, je te propose la solution suivante :

    Dans ta solution, tu crées 2 projets :

    -> ton projet Service Windows (avec tes classes ProjectInstaller et Service1.cs). Service1.cs contient les méthodes OnStart() et OnStop().

    -> Un 2 ème projet "Business" par exemple qui contient une classe que l'on va appelé MainManager.cs.


    C'est la classe MainManager qui va exécuter le flux de travail de ton service.

    Le projet Service avec sa classe Service1.cs va juste se contenter de créer un objet de type MainManager dans la méthode OnStart();

    Dans le constructeur de l'objet MainManager, c'est là que tu crées le Timer et que tu définit sa période. (dans mon exemple 1 minute)

    Puis, dans la classe MainManager.cs, tu gères l'évènement Timer_Elpased. Dans cet evènement :

    - 1. Tu désactives le Timer
    - 2. Tu executes ton flux de travail
    - 3. Tu réactives ton Timer


    classe MainManager

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    using System;
    using System.IO;
    using System.Timers;
     
     
    namespace Test.Business
    {
       public class MainManager
        {
     
           public MainManager()
           {
               // Création d'un objet Timer
               monTimer = new Timer();
               monTimer .Interval = 60000;  // 60 000 ms = 60 s = 1 min        
               monTimer.AutoReset = true;
               monTimer.Elapsed += new System.Timers.ElapsedEventHandler(this.monTimer_Elapsed);
               monTimer.Enabled = true;
           }
     
     
     
           private void monTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
           {
     
               monTimer.Enabled = false;
     
               // Execution du travail à effectuer entre 2 périodes du Timer
     
               monTimer.Enabled = true;
           }
     
     
       }
     
    }
    classe Service1.cs

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    using System;
    using System.ServiceProcess;
     
    namespace Test.Service
    {
        public partial class Service1: ServiceBase
        {
            public Service1()
            {
                InitializeComponent();
            }
     
            private MainManager manager = null;
     
     
            protected override void OnStart(string[] args)
            {
     
                try
                {
                        manager = new MainManager();    
                }
     
                catch
                {
                         // Gérer l'exception
                }
     
     
            protected override void OnStop()
            {
     
            }
     
     
     
        }
    }

  5. #5
    Membre confirmé Avatar de yochima
    Profil pro
    Inscrit en
    Août 2009
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 93
    Par défaut merci yohann7751
    Parfait !!
    tout bonnement simple mais aussi impécable.
    Il fallait effectivement penser a créer une classe qui s'occupe personnellement du Timer afin d'éviter de pourrir le OnStart.

    je vais bien avancer mon code grace a toi
    merci!

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2007
    Messages
    497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 497
    Par défaut
    Ah tiens j'ai pas pense a le separe moi le timer quand j'avais fait mon service, ca donnait en gros ca:

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    using System.ServiceProcess;
     
    Le main
     
    namespace Service
    {
        static class Program
        {
            /// <summary>
            /// Point d'entrée principal de l'application.
            /// </summary>
            static void Main()
            {
     
     
                ServiceBase[] ServicesToRun;
     
                // Plusieurs services utilisateur s'exécutent dans le même processus. Pour ajouter
                // un autre service à ce processus, modifiez la ligne suivante
                // pour créer un second objet service. Par exemple,
                //
                //   ServicesToRun = new ServiceBase[] {new Service1(), new MySecondUserService()};
                //
                ServicesToRun = new ServiceBase[] { new Service1() };
     
                ServiceBase.Run(ServicesToRun);
            }
        }
    }
    et le service1

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    using System.ServiceProcess;
    using System.Timers;
    using Npgsql;
    using System.Collections.Generic;
    using System.Net.Mail;
    using System;
     
    namespace Service
    {
        public partial class Service1 : ServiceBase
        {
     
            System.Timers.Timer aTimer = new System.Timers.Timer(21600000);//en milli seconde 21600000 = 6h
     
            public Service1()
            {
                InitializeComponent();
            }
     
            protected override void OnStart(string[] args)
            {
                //Mise en place du timer
                aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
                aTimer.Enabled = true;
            }
     
            // Specify what you want to happen when the Elapsed event is 
            // raised.
            private void OnTimedEvent(object source, ElapsedEventArgs e)
            {
                    EnvoieMail();
            }
     
            /// <summary>
            /// Stop this service.
            /// </summary>
            protected override void OnStop()
            {
                monevent.EEecrire("Service arrete");
                monevent = null;
                aTimer.Dispose();
            }
     
     
            /// <summary>
            /// Envoie de mail
            /// </summary>
            private void EnvoieMail(NpgsqlConnection conn)
            {
                aTimer.Stop();
     
                try
                {
                   //...
                }
                catch (Exception ex)
                {
                    monevent.EEecrire("Erreur envoye mail " + ex.ToString());
                }
                finally
                {
                    aTimer.Start();
                }
            }
     
        }
     
     
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Timer dans un service windows pour création d'un serveur
    Par amine_taz dans le forum PureBasic
    Réponses: 1
    Dernier message: 24/02/2014, 12h34
  2. Problème de timer dans un service window
    Par EmacLi dans le forum Services Windows
    Réponses: 5
    Dernier message: 10/01/2011, 11h43
  3. DBexpress dans un service windows
    Par jmmazie dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 30/09/2008, 12h12
  4. lancement sqlloader dans un service Windows
    Par DrZoune dans le forum C#
    Réponses: 7
    Dernier message: 05/02/2008, 10h19
  5. Réponses: 5
    Dernier message: 28/12/2007, 09h56

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