5

我找到了这个答案并尝试遵循它,但是在我开始服务时它没有给我带来任何工作。我无法理解的一件事是:`_timer = new Timer(10 * 60 * 1000); // 每 10 分钟

我想每天晚上 10:00 执行我的服务,我该怎么做?

4

4 回答 4

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);
}
于 2012-08-12T01:26:48.300 回答
4

您可以使用 Quartz.NET 来托管服务,而不是滚动您自己的计时器。它运行良好,并具有一些附加功能,例如追赶(如果需要)以及农场服务的能力。

http://quartznet.sourceforge.net/

于 2012-08-12T01:09:31.983 回答
3

Windows 有一个内置的任务调度程序,可以更好地满足任何调度需求。在处理诸如系统重启、夏令时之类的计划任务时,有很多事情可能会出错。

可以参考 Ayende 的博客,了解制作自己的调度程序时的一些问题。 烂调度:不要自己动手

于 2012-08-12T01:02:10.217 回答
1

即使计时器在您引用的答案中每十分钟轮询一次 - 它每天只处理一次:

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

十分钟是用作轮询频率的时间。

于 2012-08-12T00:59:57.507 回答