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

9

我需要每天在太平洋时间午夜执行一项任务。我正在使用带有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个回答

4
如果您的计划任务由Web应用程序托管,那么您可能会遇到这些问题。Web应用程序不适合运行计划任务。您应该创建托管计划任务的Windows服务。
但是,您也可以检查以下几点:
1. 尝试使用更短的时间间隔(例如,将间隔设置为1分钟,看看是否有效)。 2. 尝试使用CronTrigger - 我在Windows服务中使用它,并且运行良好。
有一些文章解释了将计划任务托管在Web应用程序中的优缺点,例如:http://www.foliotek.com/devblog/running-a-scheduled-task/

我使用了CronTrigger - 它的工作并不完美。它没有在应该运行的确切时间运行,但足够接近。 - Marta
1
在我的情况下,将时间间隔从30分钟减少到5分钟可以使作业正常工作。 - dsm

4

这个问题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)触发作业。使用间隔 数字 次数和重复计数 数字 次数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接