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

后端 未结 5 975
时光取名叫无心
时光取名叫无心 2021-02-01 11:16

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 s

相关标签:
5条回答
  • 2021-02-01 11:27

    I need this functionality also. That is, my C# windows service must check email every 10 minutes. I stripped down some logic to make the code more effective, as follows :

    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();
            }
    

    The timer_elapsed method indeed will be call every 10 minutes, starting from the first _timer.start(), which you miss it by the way. I haven't done any checking of the _lastRun and startAt. I don't think we need it

    0 讨论(0)
  • 2021-02-01 11:33

    Try starting the timer,

    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);
    _timer.Start();
        }
    
        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();
            }
        }
    
    0 讨论(0)
  • 2021-02-01 11:40

    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
    }
    
    0 讨论(0)
  • 2021-02-01 11:41

    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.

    0 讨论(0)
  • 2021-02-01 11:42

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

    0 讨论(0)
提交回复
热议问题