Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to have a function run inside a service every 10 minutes?

I have a windows service running, inside this i want to run a function every then minutes. I have found some code but it doesn't seem to work? I have a logger and it does not seem to go into the timer_Elapsed function ever?

 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();
        }
    }
like image 836
Beginner Avatar asked Apr 18 '12 08:04

Beginner


3 Answers

You need to start the timer:

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
}
like image 163
Daniel Hilgarth Avatar answered Oct 20 '22 00:10

Daniel Hilgarth


I don't see _timer.Start(), that should be your problem.

like image 27
Tigran Avatar answered Oct 19 '22 23:10

Tigran


Daniel Hilgarth is correct - the main issue is that you never call Start on the timer.

That being said, you might want to also consider using the Windows Task Scheduler instead of a service with a timer. This allows you to schedule the task to run every 10 minutes, but also change the schedule whenever desired without a compilation change.

like image 3
Reed Copsey Avatar answered Oct 20 '22 00:10

Reed Copsey