2012-04-18 73 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進行任何檢查。我不認爲我們需要它

相關問題