8
votes

Comment faire fonctionner une fonction à l'intérieur d'un service toutes les 10 minutes?

J'ai un service Windows en cours d'exécution, à l'intérieur de cela, je veux exécuter une fonction toutes les minutes. J'ai trouvé du code mais cela ne semble pas fonctionner? J'ai un enregistreur et il ne semble pas aller dans la fonction Timer_ELAPSED JAMAIS?

 protected override void OnStart(string[] args)
    {
       // SmartImportService.WebService.WebServiceSoapClient test = new WebService.WebServiceSoapClient();
       // test.Import();
         log.Info("Info - Service Started");
        _timer = new Timer(10 * 60 * 1000); // every 10 minutes??
        _timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
    }

    private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        log.Info("Info - Check time");
        DateTime startAt = DateTime.Today.AddHours(9).AddMinutes(48);
        if (_lastRun < startAt && DateTime.Now >= startAt)
        {
            // stop the timer 
            _timer.Stop();               

            try
            {
                log.Info("Info - Import");
                SmartImportService.WebService.WebServiceSoapClient test = new WebService.WebServiceSoapClient();
                test.Import();
            }
            catch (Exception ex) {
                log.Error("This is my error - ", ex);
            }

            _lastRun = DateTime.Now;
            _timer.Start();
        }
    }


3 commentaires

Avez-vous besoin d'appeler commencer sur la minuterie?


Voir Stackoverflow.com/questions/246697/Windows-Service-and-Timer


Pourquoi? datetime.today.addhours (9) .Adminutes (48);


5 Réponses :


21
votes

Vous devez démarrer la minuterie:

protected override void OnStart(string[] args)
{
     log.Info("Info - Service Started");
    _timer = new Timer(10 * 60 * 1000); // every 10 minutes
    _timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
    _timer.Start(); // <- important
}


1 commentaires

Pour les 10 minutes, je préfère utiliser tispan.fromminutes (10) .totallilliseconds; au lieu de 10 * 60 * 1000



4
votes

Je ne vois pas _timer.start () , cela devrait être votre problème.


0 commentaires

1
votes

Essayez de démarrer la minuterie , xxx


0 commentaires

3
votes

Daniel Hilgarth est correct - le problème principal est que vous n'appelez jamais démarrer sur la minuterie.

Cela étant dit, vous pouvez également envisager d'utiliser le planificateur de tâches Windows au lieu d'un service avec une minuterie. Cela vous permet de planifier la tâche à exécuter toutes les 10 minutes, mais modifiez également le calendrier à tout moment sans changement de compilation.


0 commentaires

3
votes

J'ai aussi besoin de cette fonctionnalité. C'est-à-dire que mon service Windows C # doit vérifier le courrier électronique toutes les 10 minutes. J'ai dépouillé une logique pour rendre le code plus efficace, comme suit:

private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            _timer.Stop();
            try
            {
                EventLog.WriteEntry(Program.EventLogName, "Checking emails " + _count++);
            }
            catch (Exception ex)
            {
                EventLog.WriteEntry(Program.EventLogName, "This is my error " + ex.Message);
            }
            _timer.Start();
        }


0 commentaires