我找到了this answer,我试着按照这个做法,但是当我开始服务时,它并没有带给我任何工作。我无法理解的一件事是:`_timer = new Timer(10 * 60 * 1000); //每10分钟
我想每天晚上10点开始服务,我怎么能这样做?
答案 0 :(得分:8)
您可以在difference
和current time
之间找到desired schedule time
,并相应地设置过去时间间隔。这样,计时器will fire once
在计划时间内发生。将时间间隔设置为经过时间的24小时。
private System.Timers.Timer _timer;
private void SetTimer()
{
DateTime currentTime = DateTime.Now;
int intervalToElapse = 0;
DateTime scheduleTime = new DateTime(currentTime.Year, currentTime.Month, currentTime.Day, 10,0,0);
if (currentTime <= scheduleTime)
intervalToElapse = (int)scheduleTime.Subtract(currentTime).TotalSeconds;
else
intervalToElapse = (int)scheduleTime.AddDays(1).Subtract(currentTime).TotalSeconds;
_timer = new System.Timers.Timer(intervalToElapse);
_timer.Elapsed += new System.Timers.ElapsedEventHandler(_timer_Elapsed);
_timer.Start();
}
void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
//do your work
_timer.Interval = (24 * 60 * 60 * 1000);
}
答案 1 :(得分:4)
您可以使用Quartz.NET来托管服务,而不是滚动自己的计时器。它运行良好,并具有一些额外的功能,如赶上(如果你需要)以及提供服务的能力。
答案 2 :(得分:3)
Windows有一个内置的任务调度程序,可以更好地用于任何调度需求。在处理调度任务(例如系统重启,日光节省)时,可能会出现许多问题。
可以参考Ayende的博客,了解制作自己的调度程序时遇到的一些问题。 Rotten scheduling: Don’t roll your own
答案 3 :(得分:1)
即使Timer在您引用的答案中每十分钟轮询一次 - 它每天只处理一次:
private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
// ignore the time, just compare the date
if (_lastRun.Date < DateTime.Now.Date)
{
要在上午10:00实现,请添加其他条件,例如:
_lastRun.Date&lt; DateTime.Now.Date &amp;&amp; DateTime.Now.Hour = 10
十分钟是用作投票频率的时间。