2009-10-26 96 views
12

定时器的最大时间间隔为2,147,483,647。大约25天。但在我的要求中,我需要计时器将等待30天。我该如何解决它?请帮忙。最大定时器时间间隔

+2

哪个定时器? .NET中至少有3个不同的计时器! – 2009-10-26 13:29:15

+1

System.Threading; – Wilson 2009-10-26 13:32:04

+7

这不是一个错误的方式。一个错误是当你的代码和你的规范不一致时。我想你会发现这是一个有据可查的限制。 – paxdiablo 2009-10-26 13:33:25

回答

22

为此使用System.Threading.Timer。有longuintTimeSpan而不是intdueTime的构造方法。其中任何一项都会让您设置30天的时间。

更新:这是做到这一点的最简单的方法:

System.Threading.Timer _timer; 
public void Start30DayTimer() 
{ 
    TimeSpan span = new TimeSpan(30, 0, 0, 0); 
    TimeSpan disablePeriodic = new TimeSpan(0, 0, 0, 0, -1); 
    _timer = new System.Threading.Timer(timer_TimerCallback, null, 
     span, disablePeriodic); 
} 

public void timer_TimerCallback(object state) 
{ 
    // do whatever needs to be done after 30 days 
    _timer.Dispose(); 
} 
+1

现在你只需要保持你的系统健康和快乐30天。 – 2009-10-26 13:58:02

+3

@亨克:这个问题没有提及*为什么*计时器的时间需要30天。对于我们所知道的,这个计时器可能会被用来发送电子邮件给某人说:“嘿,这台服务器连续运行了30天”。 – MusiGenesis 2009-10-26 14:00:16

+5

30天,是的。但最大值约为49天,因为即使使用int64或TimeSpan版本,它也不会接受超过2 * 32-2毫秒的值。 – RenniePet 2011-06-13 00:11:00

13
int days = 30; 

创建一个定时器一天。

每当定时器启动时减少days

+2

我同意。定时器并非真正意图应对延长至30天的时间段,尽管我的计时器每天运行超过一次。 – ChrisBD 2009-10-26 13:33:57

+5

即使使用int64和TimeSpan版本,System.Threading.Timer被限制为大约49天(2 * 32毫秒)。所以对于一个很长时间的通用计时器来说,这是一个有效的方法。 – RenniePet 2011-06-13 00:51:46

10

您可以随时让计时器等待较短的时间,如一天,计时器每次触发计数器并检查计数器的当前值。如果值为30,则执行应该每30天运行一次的代码。

更好的办法是将值设置在某个外部文件的某个位置,以便如果程序意外退出,则可以恢复您离开的位置。理想情况下,您可能希望将下一个运行日期放在文件中,以便如果程序关闭多天,则可以恢复并在正确的日期触发它,而不必担心上次运行的时间。因此,像

NextRunDate = 2009/10/10 4:40 PM

当程序运行时它会设置提前的日期还有30天。

3

将日期时间变量设置为日期时间,当您想要执行任何它时...然后,只需让计时器检查每分钟(或任何您需要的准确度级别)以查看该日期时间是否已过去。 。

1

要做到这一点有一个计时器,你还需要一个应用程序,并且没有中断30+天运行的PC。并非不可能,但是风险很大。

这听起来像你想要的东西安排执行。计算目标日期/时间并将其保存为XML或.config文件。当应用程序重新启动时,它可以重新计算用于触发事件的TimeSpan。

4

这是计时器,告诉你你的应用程序更适合作为计划任务来实现。

0

计时器的构造函数将采用一个TimeSpan,它是int64肯定会超过25天?

您是否也考虑过系统可能无法保持30天?

只看了一眼,就是10,675,199天。

4

我强烈建议使用Windows Scheduled Task功能,尤其是如果这是为了在每个月的同一天运行某些功能,因为月份会在28到31天之间变化。

+1

这不是问题的答案。如果您在给定时间(计划程序)启动应用程序,或者正在运行的应用程序在给定时间(计时器)正在执行某些操作,则这是完全不同的。 – 2012-03-28 10:12:44

1

Quartz.NET库是定期运行代码的另一种选择。