2012-04-30 82 views
2

我有一個Windows服務正在運行。其中的任務目前在每天晚上7點運行。 讓它運行的最好方法是在上午9時45分,上午11時45分,下午2時,下午3時45分,下午5時和下午5時45分舉例說明。Windows服務 - 如何讓任務在幾個特定時間運行?

我知道我可以有計劃的任務運行功能,但我想知道如何在我的Windows服務中做到這一點。下面當前代碼:

private Timer _timer; 
private DateTime _lastRun = DateTime.Now; 
private static readonly log4net.ILog log = log4net.LogManager.GetLogger 
(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

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

回答

5

如果你不想去cron或石英,寫一個函數,找時間間隔從現在到下一次運行之間並相應地復位定時器,呼籲服務的啓動和timeelapsed事件此功能。你可以做這樣的事情(代碼未測試)

System.Timers.Timer _timer; 
    List<TimeSpan> timeToRun = new List<TimeSpan>(); 
    public void OnStart(string[] args) 
    { 

     string timeToRunStr = "20:45;20:46;20:47;20:48;20:49"; 
     var timeStrArray = timeToRunStr.Split(';'); 
     CultureInfo provider = CultureInfo.InvariantCulture; 

     foreach (var strTime in timeStrArray) 
     { 
      timeToRun.Add(TimeSpan.ParseExact(strTime, "g", provider)); 
     } 
     _timer = new System.Timers.Timer(60*100*1000); 
     _timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed); 
     ResetTimer(); 
    } 


    void ResetTimer() 
    { 
     TimeSpan currentTime = DateTime.Now.TimeOfDay; 
     TimeSpan? nextRunTime = null; 
     foreach (TimeSpan runTime in timeToRun) 
     { 

      if (currentTime < runTime) 
      { 
       nextRunTime = runTime; 
       break; 
      } 
     } 
     if (!nextRunTime.HasValue) 
     { 
      nextRunTime = timeToRun[0].Add(new TimeSpan(24, 0, 0)); 
     } 
     _timer.Interval = (nextRunTime.Value - currentTime).TotalMilliseconds; 
     _timer.Enabled = true; 

    } 

    private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     _timer.Enabled = false; 
     Console.WriteLine("Hello at " + DateTime.Now.ToString()); 
     ResetTimer(); 
    } 
+0

ERM可以顯示例如PLZ,DNT知道從哪裏開始? – Beginner

+0

timeToRun何時會被設置? – Beginner

+0

我得到錯誤.... System.NullReferenceException:對象引用未設置爲對象的實例。 at SmartUploadSyncService.Service1.ResetTimer() – Beginner

0

如果妳很清楚生根粉什麼時間表應該run..then變化的時間間隔定時器在timeelapsed事件,以便它運行2.根據schedule..i've從來沒有嘗試過,雖然

0

我會使用一個後臺線程,並讓它執行一個無限循環,它會執行你的工作並且睡15分鐘。與使用定時器相比,它對服務代碼來說會更清潔和更簡單。

參見MSDN this文章。

5

考慮使用Quartz.netCronTrigger

+0

我已經下載了石英你又能告訴我的,我怎麼會在我的代碼實現CronTrigger的例子嗎? – Beginner

+0

檢查教程http://quartznet.sourceforge.net/tutorial/index.html並詢問你是否有任何具體問題 – empi

相關問題