using System.Threading.Tasks;
var cs = Quartz.CronScheduleBuilder.CronSchedule(" 0 0 12 20/1 * ? *");
await Test(cs , "Default");
await Test(cs.WithMisfireHandlingInstructionDoNothing() , "WithMisfireHandlingInstructionDoNothing" );
await Test(cs.WithMisfireHandlingInstructionIgnoreMisfires() , "WithMisfireHandlingInstructionIgnoreMisfires");
await Test(cs.WithMisfireHandlingInstructionFireAndProceed() , "WithMisfireHandlingInstructionFireAndProceed");
static void ShowFireTimes(CronScheduleBuilder sb)
var trig = (IOperableTrigger) CreateTrigger(sb);
var dt = trig.ComputeFirstFireTimeUtc(null);
Console.WriteLine($"Trigger fires at {dt}");
dt = trig.GetFireTimeAfter(dt);
static ITrigger CreateTrigger(CronScheduleBuilder sb)
.WithIdentity("trigger1", "group1")
.StartAt(new DateTime(2023,8, 1))
.EndAt (new DateTime(2023,8,23))
static async Task Test(CronScheduleBuilder sb , string description)
var sched = await new StdSchedulerFactory().GetScheduler();
IJobDetail job = JobBuilder.Create<DumbJob>().WithIdentity( description, "group1").Build();
DateTimeOffset ft = await sched.ScheduleJob(job, CreateTrigger(sb));
await Task.Delay(TimeSpan.FromSeconds(1));
await sched.Shutdown(true);
SchedulerMetaData metaData = await sched.GetMetaData();
Console.WriteLine($"{description} Executed {metaData.NumberOfJobsExecuted} job(s).");
public class DumbJob : Quartz.IJob
public virtual async Task Execute(IJobExecutionContext context)
Console.WriteLine($"Executing {context.JobDetail.Key.Name} at {DateTime.UtcNow}");
await Task.CompletedTask;