精确的三分钟计时器间隔

本文关键字:计时器 三分钟 | 更新日期: 2023-09-27 18:24:33

在我之前的问题中,我问过将时间值四舍五入到最接近的第三分钟。现在我的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启动,在2012年12月15日中午12:21:00.000,它必须工作WorkTimer_Elapsed,但它从2012年2日15日12:24:01.871开始如何解决此问题我修正了我的CurrentTime时间(来自前一个问题):

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;
            }
        }

精确的三分钟计时器间隔

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

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

顺便说一句:你的四舍五入算法应该加90秒(因为这是3分钟的一半),而不是30秒。如果你在12:31:50加上30秒,你会得到12:30:00,但应该是12:33:00。

使用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)