在C#Timer中完成小时后正好点火蜱事件

时间:2010-11-26 11:54:27

标签: c# events timer

我希望tick事件在每小时完成后每小时触发一次。对于例如它应该在8 am上然后在9 am然后在10 am等上打勾。 我需要将Interval设置为3600000,这很简单。

这里的问题是我应该如何确定何时启动计时器? 我正在创建一个工具,从用户登录时开始在系统托盘中运行。

5 个答案:

答案 0 :(得分:10)

请不要创建一个只会浪费内存的程序。这就是Windows的任务计划程序的用途。从这样的任务每小时运行你的程序。

http://msdn.microsoft.com/en-us/library/aa384006%28v=VS.85%29.aspx

以下是一个示例:

  • 转到开始 - >程序 - >附件 - >计划任务。
  • 在右侧,点击“添加任务..”。
  • 选择您的可执行文件。
  • 转到“触发器”标签。
  • 使用以下选项创建触发器:

Run Daily 
Start today at 8:00 am
Repeat every 1 Hour

很抱歉,由于我运行的是德语版的Windows 7,因此无法提供任何屏幕截图。

答案 1 :(得分:4)

可能是下面的代码是错误的,但想法是这样的:

    public void InitTimer()
    {
        DateTime time = DateTime.Now;
        int second = time.Second;
        int minute = time.Minute;
        if (second != 0)
        {
            minute = minute > 0 ? minute-- : 59;
        }

        if (minute == 0 && second == 0)
        {
            // DoAction: in this function also set your timer interval to 3600000
        }
        else
        {
            TimeSpan span = new TimeSpan(0, 60 - minute, 60 - second);
            timer.Interval = (int) span.TotalMilliseconds - 100; 
            timer.Tick += new EventHandler(timer_Tick);
            timer.Start();
        }
    }

    void timer_Tick(object sender, EventArgs e)
    {
        timer.Interval = 3600000;
        // DoAction
    }

编辑:正如@smirkingman所提供的,由于项目启动和运行此应用程序的延迟,我删除了一些毫秒: timer.Interval = (int) span.TotalMilliseconds - 100;

答案 2 :(得分:1)

我认为如果你每隔一段时间设置一个计时器就更容易了,比如分钟,这个计时器可以检查系统时钟,当所需时间小于或等于系统时间时你可以运行动作(在此示例的错误为1分钟最大值)

如果您使用定时器间隔dinamyc,您可以改进它,例如,如果您检查时间并且还剩下半小时,您可以将间隔设置为15分钟,接下来将时间间隔设置为5分钟,依此类推,直到你正在检查每秒一次的时钟,以便检查。

HTH

答案 3 :(得分:1)

我是这样做的。 Tick事件每20秒触发一次。只需将分钟==“xxx”更改为您希望事件触发的任何时间。如果您需要分散数小时的事件,只需将间隔计时器设置得更长。简单有效。

private void timer1_Tick(object sender, EventArgs e)
    {
      DateTime Time = DateTime.Now;
          int minutes = Time.Minute;

            if (minutes == 00)  //FIRE ON THE HOUR
                { DO THIS  }

            if (minutes == 15)  //FIRE ON 1/4 HOUR
                {  DO THIS }

            if (minutes == 30)  //FIRE ON 1/2 HOUR
                { DO THIS }

            if (minutes == 45)  //FIRE ON 3/4 HOUR
                { DO THIS }
    }

答案 4 :(得分:0)

不是每小时开一次计时器,也许每分钟开一次计时器更合适,并检查是否还有时间。

唯一的问题是最坏情况滞后是59秒。如果你需要它在小时(早上10点)发射完全,你可能需要在第一次进行间隔时做一些调整,以便你排队。