系统时钟已经过了每小时一次事件

时间:2012-10-12 14:46:47

标签: c#

我想在系统时钟每过一小时就提出一个事件。 例如,我在上午7:45运行我的程序,然后事件应该在上午8:00而不是在上午8:45提出。 在上午8:00举办活动之后,应该在每天上午9:00,上午10:00,上午11:00等举办此活动......

任何人都可以帮我展示一些代码...... 我用C#.net ... 提前谢谢......

更新

现在我为我的问题找到了简单的解决方案。因此,我想分享这个解决方案。 lboshuizen的答案已经是正确的。我的回答与lboshuizen的回答是一致的,但更详细和准确。

首先需要使用Timer。计时器基本上基于毫秒工作,有时需要额外的计算。因此,我想首先实现毫秒到分钟格式化功能。

int CalculateMillisecondUntilNextHour()
{
     int REMAIN_MINUTE = 60 - DateTime.Now.Minute;
     DateTime now = DateTime.Now;
     DateTime nexthour = now.AddMinutes((minute)).AddSeconds(now.Second * -1).AddMilliseconds(now.Millisecond * -1);

     TimeSpan interval = nexthour - now;
     return (int)interval.TotalMilliseconds;
}

void CheckEachHourPassed()
{
     System.Windows.Forms.Timer t = new System.Windows.Forms.Timer();
     t.Interval = CalculateMillisecondUntilNextHour();
     t.Tick += new EventHandler(t_Tick);
     t.Enabled = true;
}

void t_Tick(object sender, EventArgs e)
{
     MessageBox.Show("Raise Your Event");
     t.Interval = CalculateTimerInterval(REMAIN_MINUTE);
}

在这里,主要的工作功能是CheckEachHourPassed()。在要启动事件调度程序的位置调用此函数。

3 个答案:

答案 0 :(得分:0)

您可以通过修复Timer属性

来使用Interval

链接:http://msdn.microsoft.com/fr-fr/library/system.timers.timer.aspx

答案 1 :(得分:0)

伪代码(实现留给读者练习

var currentTime = Time.Now()
var deltaMinutes  = Calculate_minutes_till_next_full_hour(currentTime);
wait(deltaMinutes);
var timer = new timer();
timer.Every().Minutes(60).Execute(() => Code());

答案 2 :(得分:0)

问题在于

timer.Every().Minutes(60).Execute(() => Code());

随着时间的推移实际上可能与实时不同步。

如何在一个线程中运行它

var lastMoment = DateTime.Now;
while(true)
   if(DateTime.Now.Hour != lastMoment.Hour)
   {
       //Raise ElaspedHourEvent
       //Thread.Sleep(1000);
   ]

它可能不会在一小时后触发事件,但至少它不会失去同步。

相关问题