2012-06-05 150 views
1

如何讓System.Timers.Timer每15分鐘觸發Elapsed事件與系統時鐘同步?換句話說,我希望它在xx:00,xx:15,xx:30,xx:45(其中xx表示任意小時)時精確觸發C#,System.Timers.Timer,每15分鐘與系統時鐘同步運行

+2

您可以讓它每秒過去一次,並檢查當前時間是00,15,30或45,然後才轉發事件。 –

+2

'正好'由於其他系統活動而不太可能... –

+0

@MitchWheat - 考慮到我們擁有的許多工具(並且不是微秒),「不可能」是不太可能的。 –

回答

0

您可以讓它每秒過去一次,並檢查當前時間是00,15,30或45,然後才轉發事件。

第一想法是:

private static System.Timers.Timer aTimer; 
private static System.DateTime _last; 

public static void Main() 
{ 
    aTimer = new System.Timers.Timer(10000); 

    aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 

    aTimer.Interval = 1000; 
    aTimer.Enabled = true; 

    Console.WriteLine("Press the Enter key to exit the program."); 
    Console.ReadLine(); 
} 

private static void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    DateTime time = 
     new DateTime(1,1,1, DateTime.Now.Hours, DateTime.Now.Minute); 

    if(time.Minute==0 ||time.Minute==15 || time.Minute==30 || time.Minute==45) 
    { 
     // Avoid multiple notifications for the same quarter. 
     if (_last==DateTime.MinValue || _last!=time) 
     { 
      _last = time; 

      // Do further processing. 
      doProcessing(); 
     } 
    } 
} 

(實施例基於this MSDN documentation

0

當開始該程序,或者改變事件時間將被觸發,事件時間加載到存儲器(以避免每秒從硬盤讀取這些數據。)然後設置一個定時器,每隔1秒觸發一次。設置爲每1秒觸發的計時器在處理器上的開銷很小。設置一個並打開任務管理器,您甚至不會注意到處理器運行的時間超過定時器運行之前的時間。然後在計時器事件中進行檢查,以檢查是否應該開啓事件。

0

使用Quartz.net。然後你可以使用regex來定義間隔。