如何在Quartz.net的同一时间每天开始工作?

时间:2012-04-30 08:14:49

标签: c# asp.net-mvc-3 scheduling quartz.net

我必须每天在太平洋时间午夜执行工作。我正在使用带有Quartz.NET库的MVC3。

这是我的代码:

public static void ConfigureQuartzJobs()
{
    ISchedulerFactory schedFact = new StdSchedulerFactory();

    IScheduler sched = schedFact.GetScheduler();

    DateTime dateInDestinationTimeZone = System.TimeZoneInfo
        .ConvertTimeBySystemTimeZoneId(DateTime.UtcNow, System.TimeZoneInfo.Utc.Id, "Pacific Standard Time").Date;


    IJobDetail job = JobBuilder.Create<TimeJob>()
        .WithIdentity("job1", "group1")
        .Build();

    ITrigger trigger = TriggerBuilder.Create()
        .WithIdentity("trigger1", "group1")
        .StartAt(dateInDestinationTimeZone)
        .WithSimpleSchedule(x => x.WithIntervalInHours(24).RepeatForever())
        .Build();

    sched.ScheduleJob(job, trigger);

    sched.Start();
}

此代码仅在第一个午夜(在太平洋时间)运行此作业一次。我已经设置.WithSimpleSchedule(x => x.WithIntervalInHours(24).RepeatForever()),但它不起作用 - 工作不是每天都在重复。

我可以做些什么让它每天都有效?

任何帮助非常感谢!

2 个答案:

答案 0 :(得分:4)

您的计划任务是否由Web应用程序托管?如果是这样,您可能会遇到此类问题。 Web应用程序不适合运行计划任务。您应该创建承载计划任务的Windows服务。

但也有一些事情可以检查:

  1. 尝试使用较短的时间(例如,如果将间隔设置为1分钟,请检查是否有效)。
  2. 试试CronTrigger - 我在Windows服务中使用它,它运行正常。
  3. 有些文章解释了在Web应用程序中托管计划任务的优缺点,即。这一个:http://www.foliotek.com/devblog/running-a-scheduled-task/

答案 1 :(得分:0)

此答案已在7年前提出,并且已经被接受。但是我认为在过去的7年中有一些变化,所以我建议通过 CronScheduleBuilder 此解决方案。

        //Constructing job trigger.
        ITrigger trigger = TriggerBuilder.Create()
                          .WithIdentity("Test")
                          .WithSchedule(CronScheduleBuilder
                          .DailyAtHourAndMinute(16,40))
                      .WithSimpleSchedule(x=>x.WithIntervalInMinutes(number)
                          .WithRepeatCount(number) 
                          .Build();

此代码每天在特定时间(例如16:40)触发作业。间隔为 number 次,并重复计数为 number