【问题标题】:To raise an event every hour has passed in system clock在系统时钟中每隔一小时引发一个事件
【发布时间】:2012-10-03 09:59:39
【问题描述】:

我想在系统时钟中每个小时过去时引发一个事件。 例如,我在早上 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()。在要启动事件调度程序的地方调用此函数。

【问题讨论】:

  • google 肯定会告诉你
  • @daveL,没什么,这很明显
  • 你试过什么?你见过this吗?
  • 如果您需要每小时运行一次,请使用调度程序(例如内置于 Windows 中的调度程序),而不是自己在自己的代码中实现调度程序。尤其是如果您在每小时剩下的 59 分钟内不做任何事情。
  • @lblshuizen,我已经尝试过线程、秒表和计时器。我只是想征求你的建议。

标签: c#


【解决方案1】:

问题是

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

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

如何在线程中运行它

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

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

【讨论】:

    【解决方案2】:

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

    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());
    

    【讨论】:

    • 先生,非常感谢您的回答。但我认为如果你知道确切的答案,你应该给出答案而不是给出练习。有什么重要的,你的伪代码可以给我一些想法,谢谢。
    【解决方案3】:

    您可以通过修复Interval 属性来使用Timer

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

    【讨论】:

      猜你喜欢
      • 2010-09-23
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-08
      相关资源
      最近更新 更多