如何在每天的特定时间运行Windows服务

时间:2014-02-26 06:14:26

标签: c# timer windows-services

我有一个Windows服务,我需要在一天的特定时间运行。假设时间ID 11:00 PM。目前我有代码运行此服务每天但如何添加时间变量到这不是我不是能够得到那个。 这是我在c#中的代码..

protected override void OnStart(string[] args)
    {
        timer = new Timer();
        timer.Interval = 1000 * 60 * 60 * 24;//set interval of one day 
        timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
        start_timer();

    }

    static void timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        // Add your code here
        readDataFromAd();

    }
    private static void start_timer()
    {
        timer.Start();
    }

请帮我定义时间以及时间间隔。时间应该是晚上11点,计时器应该执行每日方法。

4 个答案:

答案 0 :(得分:3)

最好的选择是在Windows服务中使用Quartz调度程序。使用quartz,您还可以根据执行时间在单个服务中安排多个作业,例如每天上午5点。 ,每小时,每分钟,每周等。使用起来太灵活了。

答案 1 :(得分:2)

我建议您更改方法。服务通常用于始终运行的长时间运行的进程。对于按计划运行的进程,Windows有一个内置组件,名为“任务计划程序”,用于按计划运行应用程序。

您可以简单地获取应用程序服务代码并将其粘贴到Windows控制台应用程序中,然后使用Windows Task Scheduler安排生成的exe在您认为合适的任何计划上运行。

希望这有帮助。

答案 2 :(得分:0)

Quartz很棒,但是如果您想要做的就是每天运行一次服务,那么内置的Windows任务计划程序也是一个不错的选择。

你会:

  1. 更改您的服务以删除计时器/睡眠,并从OnStart()(discussion on why a thread may be necessary here)启动的线程中调用readDataFromAd()
  2. 在任务计划程序中创建一个任务,该任务在晚上11点执行以下命令:

    NET START您的服务名称

答案 3 :(得分:0)

试试这个:

 protected override void OnStart(string[] args)
        {

                _timer.Enabled = true;

                DateTime currentTime = DateTime.Now;
                int intervalToElapse = 0;
                DateTime scheduleTime = Convert.ToDateTime(ConfigurationSettings.AppSettings["TimeToRun"]);

                if (currentTime <= scheduleTime)
                    intervalToElapse = (int)scheduleTime.Subtract(currentTime).TotalSeconds;
                else
                    intervalToElapse = (int)scheduleTime.AddDays(1).Subtract(currentTime).TotalSeconds;

                _timer = new System.Timers.Timer(intervalToElapse * 1000);
                _timer.AutoReset = true;
                _timer.Elapsed += new System.Timers.ElapsedEventHandler(_timer_Elapsed);
                _timer.Start();
        }

private void _timer_Elapsed(object sender, ElapsedEventArgs e)
        {
           //do your thing
//set it to run on a 24-hour basis
     _timer.Interval = 60 * 60 * 24 * 1000;

}