2012-02-15 139 views
-1

在我的previos question我問到舍入時間值到最近的第三分鐘。 那麼現在我有一些問題,我的System.Threading.Timer必須在第三分鐘時間到來時工作。我做如下:準確的三分鐘時間計時器間隔

private System.Timers.Timer WorkTimer; 
//... 
public void StartProccessing() 
{ 
WorkTimer = new System.Timers.Timer(); 
WorkTimer.AutoReset = false; 
WorkTimer.Elapsed += new ElapsedEventHandler(WorkTimer_Elapsed); 
StartWorkTimer(); 
} 
//... 
private void StartWorkTimer() 
     { 
      WorkTimer.Interval = (CurrentTime.AddMinutes(3) - DateTime.Now).TotalMilliseconds; 
      WorkTimer.Start(); 
     } 
void WorkTimer_Elapsed(object sender, ElapsedEventArgs e) 
     { 
      WorkTimer.Stop(); 
      this.ProcessData(this.CurrentTime); 
      StartWorkTimer(); 
     } 

問題是,當計時器開始 - 它不是在第一個三分鐘的時間的工作,它開始後第二,第三分鐘的時間工作。例如: 定時器在15.02.2012 12:20:32.871啓動,在15.02.2012 12:21:00.000啓動它必須工作WorkTimer_Elapsed,但它從15.02.2012 12:24:01.871開始。 如何解決這個問題? 我解決我的CURRENTTIME時間(從previos問題):

private DateTime CurrentTime 
     { 
      get 
      { 
       DateTime now = DateTime.Now.AddSeconds(30); 
       DateTime val; 
       val = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, 0) 
        .AddMinutes(((now.Minute)/3) * 3 - now.Minute); 
       return val; 
      } 
     } 
+0

爲什麼你加30秒?刪除它應該會產生所需的結果。 – 2012-02-15 20:38:14

+0

我添加30秒 - 查看我的previos問題http://stackoverflow.com/questions/9287819/getting-accurate-three-minute-time-values – amaranth 2012-02-16 06:18:05

回答

1

這裏的問題是,你四捨五入到最接近的第3分鐘,但對於你的計時器工作,你必須使用最新的一個。

因此,如果您刪除AddSeconds(30),您的計時器應按預期工作。

附註:你的舍入算法應該增加90秒(因爲這是3分鐘的一半)而不是30.如果你在12:31:50增加30秒,你最終會得到12 :30:00,但應該是12:33:00。

0

使用System.Threading.Timer類。

DateTime dt = ... // here you assign the start time, so you can calculate 
        // the first time you want to start it. 
var timer = new Timer(callback, null, dt, TimeSpan.FromMinutes(3)); 

回調:

public delegate void TimerCallback(Object state) 
+0

在你的例子中如何糾正計時器間隔時間在PC上的時間將被糾正? – amaranth 2012-02-15 09:50:22

+0

您可以使用時間更改事件(系統時間更改時觸發)。然而,它只會在消息泵可用的情況下工作(所以它不能在Windows服務中工作)。請閱讀此處:http://msdn.microsoft.com/en-us/library/microsoft.win32.systemevents.timechanged.aspx – 2012-02-15 12:22:19