我找到了这个答案并尝试遵循它,但是在我开始服务时它没有给我带来任何工作。我无法理解的一件事是:`_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
十分钟是用作轮询频率的时间。