如何使定时器反复激活

我有一个计时器,我想在每个星期一下午五点到期。 在testing应用程序时,一旦星期一下午五点钟,我的任务就会按照它应有的时间开始。

但是,当我将系统date和时间更改为下周5点的下一周时,任务不会启动。 这是我的代码:

Timer timer = new Timer(callback, application, timeToEnd, TimeSpan.FromDays(7)); 

我有一种感觉,这与TimeSpan.FromDays(7)部分有关。 有任何想法吗?

你现在有麻烦了 我们要求框架在x days, y hours, z minutes后通知您。 所以计时器会在你告诉它什么时候发生。

我知道这不是正确的路,但这将工作。

 SystemEvents.TimeChanged += SystemEvents_TimeChanged; static void SystemEvents_TimeChanged(object sender, EventArgs e) { timer.Dispose();//Dispose your previous timer SetTimerAgain();//Call the method which sets the timer again. you're done } 

我建议“Windows计划任务”,但由于某种原因,你不能在这里是要走的路。

你也可以像@giammin建议的那样运行一个周期性的定时器。

 TimerCallback callback = (state) => { var now = DateTime.Now; if(now.DayOfWeek == DayOfWeek.Monday && now.TimeOfDay.Hours == 17 && now.TimeOfDay.Minutes == 0) { MyMethod(); } }; Timer timer = new Timer(callback, application, 0, 10000);//10seconds 

采用后一种方法,您应该防止您在同一天再次调用该方法。

这不是一个很好的使用Timer 。 您应该创建一个控制台应用程序,然后使用Windows调度程序或第三方调度工具进行调度。

否则,更安全的做法是将计时器设置为以很短的间隔(1分钟?)运行,然后检查系统时钟以查看是否需要运行(例如,是否在1分钟之内?

没有一个定时器取决于系统时间。

更改时钟不会影响System.Windows.Forms.TimerSystem.Timers.TimerSystem.Threading.Timer

如果你需要处理这些情况,你必须依靠SystemEvents.TimeChanged

否则,您可以定期检查DateTime.Now.DayOfWeek == DayOfWeek .Monday

如果您不想依赖外部服务(如Windows任务计划程序),则必须创建一个定时器(定期触发),并检查当前时间,如果当前时间已经超过了下一个过期时间它实际上执行所需的操作(包括设置下一个到期时间)。

除非您在低功耗设备上运行,否则每分钟执行一次时间检查应该不成问题。

将时钟向前移动一周是非常极端的措施,但夏令时也可以使时钟移动,特别是在虚拟机上,您可能会有一些意外的时钟漂移。 这就是为什么在大多数情况下,定期检查当前时间要比设置一个定时器在遥远的未来时间触发更好的原因。

说到夏令时,您需要处理时钟向后移动一小时的情况,以防您希望在该时间段内执行活动。

如果您想要在特定时间触发的计时器,请使用等待计时器 。 不幸的是,.NET库没有这个定时器的包装器。 我有一段时间写了一篇文章。 该文章不再在线提供,但可以从http://mischel.com/pubs/waitabletimer.zip下载源代码。

这就是说,这听起来对你来说是一个打瞌睡的计划 。 按照其他人的建议,使之成为一个简单的控制台应用程序,您可以使用计划任务进行控制。