精确的三分钟时间计时器间隔

时间:2012-02-15 09:00:37

标签: c# .net datetime timer

在我的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();
        }

问题是指计时器启动时 - 它在第一个第三分钟时间内无效,在第二个第三分钟后开始工作。例如: 定时器启动时间为2012年2月15日12:20:32.871,15.02.2012 12:21:00.000它必须工作WorkTimer_Elapsed,但它从2012年2月15日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;
            }
        }

2 个答案:

答案 0 :(得分:1)

这里的问题是你四舍五入到最近的第3分钟,但是为了你的计时器工作,你必须使用最新的。

因此,如果删除AddSeconds(30),您的计时器应按预期工作。

侧面说明:你的舍入算法应该增加90秒(因为那是3分钟的一半)而不是30秒。如果你在12:31:50增加30秒,你最终会得到12: 30:00,但应该是12:33:00。

答案 1 :(得分: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)