安排C#Windows服务每天执行一项任务

时间:2012-08-12 00:54:37

标签: c# windows-services scheduled-tasks

我找到了this answer,我试着按照这个做法,但是当我开始服务时,它并没有带给我任何工作。我无法理解的一件事是:`_timer = new Timer(10 * 60 * 1000); //每10分钟

我想每天晚上10点开始服务,我怎么能这样做?

4 个答案:

答案 0 :(得分:8)

您可以在differencecurrent 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来托管服务,而不是滚动自己的计时器。它运行良好,并具有一些额外的功能,如赶上(如果你需要)以及提供服务的能力。

http://quartznet.sourceforge.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

  

十分钟是用作投票频率的时间。