0

我想在系统时钟中每个小时过去时引发一个事件。例如,我在早上 7:45 运行我的程序,那么应该在早上 8:00 而不是早上 8:45 提出事件。在上午 8:00 发起活动后,则应在上午 9:00、上午 10:00、上午 11:00 等每小时发起一次...

谁能帮我展示一些代码...我使用 C#.net...在此先感谢...

更新:

现在我得到了我的问题的简单解决方案。因此,我想分享这个解决方案。lboshuizen 的回答已经是正确的了。我的回答与 lbohuizen 的回答逻辑相同,但更详细和准确。

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

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()。在要启动事件调度程序的地方调用此函数。

4

3 回答 3

0

您可以Timer通过固定Interval属性使用

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

于 2012-10-12T14:48:16.110 回答
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());
于 2012-10-12T14:59:37.110 回答
0

问题是,

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

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

如何在线程中运行它

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

它可能最多在一小时后的一秒钟内触发事件,但至少它不会不同步。

于 2013-03-03T21:01:12.347 回答