我找到了这个答案并尝试遵循它,但是在我开始服务时它没有给我带来任何工作。我无法理解的一件事是:`_timer = new Timer(10 * 60 * 1000); // 每 10 分钟
我想每天晚上 10:00 执行我的服务,我该怎么做?
我找到了这个答案并尝试遵循它,但是在我开始服务时它没有给我带来任何工作。我无法理解的一件事是:`_timer = new Timer(10 * 60 * 1000); // 每 10 分钟
我想每天晚上 10:00 执行我的服务,我该怎么做?
您可以找出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);
}
您可以使用 Quartz.NET 来托管服务,而不是滚动您自己的计时器。它运行良好,并具有一些附加功能,例如追赶(如果需要)以及农场服务的能力。
Windows 有一个内置的任务调度程序,可以更好地满足任何调度需求。在处理诸如系统重启、夏令时之类的计划任务时,有很多事情可能会出错。
可以参考 Ayende 的博客,了解制作自己的调度程序时的一些问题。 烂调度:不要自己动手
即使计时器在您引用的答案中每十分钟轮询一次 - 它每天只处理一次:
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 < DateTime.Now.Date && DateTime.Now.Hour = 10
十分钟是用作轮询频率的时间。