我希望tick事件在每小时完成后每小时触发一次。对于例如它应该在8 am
上然后在9 am
然后在10 am
等上打勾。
我需要将Interval
设置为3600000
,这很简单。
这里的问题是我应该如何确定何时启动计时器? 我正在创建一个工具,从用户登录时开始在系统托盘中运行。
答案 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点)发射完全,你可能需要在第一次进行间隔时做一些调整,以便你排队。