2015-07-19 114 views
1

我的服務將多次運行日常任務。這裏是我的服務代碼:Windows服務中具有不同間隔時間的多個定時器

private DateTime m_scheduleTime; 
private List<Task> m_tasksList; // Task includes id and time ("23:00") 

protected override void OnStart(string[] args) { 
    SetSchedule(); 
} 

private void SetSchedule() 
{ 
    Timer[] timers = new Timer[m_tasksList.Count]; 
    int iHours = 0; int iMinutes = 0; 
    for (int i = 0; i < timers.Length; i++) 
    { 
     iHours = Int16.Parse(m_tasksList[i].Time.Split(':')[0]); 
     iMinutes = Int16.Parse(m_tasksList[i].Time.Split(':')[1]); 
     m_scheduleTime = DateTime.Today.AddDays(1).AddHours(iHours).AddMinutes(iMinutes); 
     timers[i] = new Timer(); 
     timers[i].Enabled = true; 
     timers[i].Interval = m_scheduleTime.Subtract(DateTime.Now).TotalSeconds * 1000; 
     timers[i].Elapsed += new System.Timers.ElapsedEventHandler(Timer_Elapsed); 
    } 
} 

protected void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
{ 
    DoWork(int taskId); 
} 

上面的代碼沒有經過測試,我從相關的代碼示例構建它。所以我的問題是我不知道我是否在正確的軌道上,如果我是正確的,我不知道哪個計時器觸發_Elapsed事件,以便我可以傳遞相應的參數。更好的解決方案,將不勝感激!

回答

2

你很可能已經使用單一System.Threading.Timer,在某些最小分辨率定期到期,更好的結果說成每60秒。

當您的服務開始時,計算您所有任務的計劃運行時間的下一個,並隨時將它們插入優先級隊列。優先隊列應該按計劃的運行時間排序。

你的每一個計時器到期時,評估任務的預定運行時間在你的隊列的頭。如果已經達到任務的運行時間,請將其從隊列中彈出並將其推送到工作線程將執行的隊列中。重複此過程,直到您用完隊列中的任務或找到尚未準備好運行的任務。

一旦任務完成,計算它的下一個計劃的運行時間,並把它插入到預定的優先級隊列。

如果您的服務純粹是爲了運行這些計劃任務的目的,我建議你可以考慮使用Windows任務計劃程序來代替。老實說,即使您的服務提供了其他功能,使用Windows任務計劃程序運行定期任務仍然是比嘗試推出自己的計劃程序更好的選擇。

你可以找到一個託管包裝的Windows任務計劃程序,在這裏http://taskscheduler.codeplex.com/。我不知道這個包裝,我發現它在這個問題中引用:C# API for Task Scheduler 2.0

+0

你可以給我一些工作的Windows任務計劃代碼示例? – user1728585

相關問題