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