2012-04-18 69 views
6

我有一个Windows服务正在运行,在这里我想每分钟运行一个函数。 我发现了一些代码,但它似乎并没有工作? 我有一个记录器,它似乎没有进入timer_Elapsed函数?如何每10分钟在一个服务中运行一个函数?

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

你需要调用定时器的启动吗? – 2012-04-18 08:54:55

+0

请参阅http://stackoverflow.com/questions/246697/windows-service-and-timer – 2012-04-18 08:56:08

+0

ahhh yeeeeeeeee – Beginner 2012-04-18 08:57:07

回答

16

您需要启动定时器:

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 
} 
+4

在10分钟内,我更喜欢使用'TimeSpan.FromMinutes(10).TotalMilliseconds;'而不是'10 * 60 * 1000' – Jaider 2016-08-15 16:23:35

3

我没有看到_timer.Start(),这应该是你的问题。

1

尝试开始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(); 
     } 
    } 
2

Daniel Hilgarth是正确的 - 主要的问题是,你永远不会调用启动计时器。

也就是说,您可能还想考虑使用Windows任务计划程序而不是带有计时器的服务。这使您可以安排任务每10分钟运行一次,而且还可以随时更改计划,而无需编辑更改。

3

我也需要这个功能。也就是说,我的C#windows服务必须每10分钟检查一次电子邮件。我剥了下来一些逻辑,使代码更有效,方法如下:

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

的timer_elapsed方法确实会调用每隔10分钟,从第一个开始_timer.start(),您可以通过该方式错过。我还没有对_lastRun和startAt进行任何检查。我不认为我们需要它

相关问题