如何使用Quartz.net实现每3天一次、当日8-10点每小时执行的任务调度
Quartz.NET 实现指定调度规则的方案
你的调度规则可以通过两种方式实现,分别适配不同的场景需求:
方案1:严格72小时间隔(推荐,完全匹配示例要求)
不受月份天数影响,固定每3天(72小时)触发,触发当日8、9、10点各执行一次。
实现步骤
- 首先安装Quartz.NET依赖
# Nuget包管理器命令 Install-Package Quartz # 或者dotnet CLI命令 dotnet add package Quartz
- 编写调度代码
using Quartz; using Quartz.Impl; // 自定义任务类,实现IJob接口 public class YourCustomJob : IJob { public async Task Execute(IJobExecutionContext context) { // 这里写你的业务逻辑 Console.WriteLine($"任务执行时间:{DateTime.Now}"); await Task.CompletedTask; } } public static async Task InitScheduler() { // 初始化调度器 ISchedulerFactory schedulerFactory = new StdSchedulerFactory(); IScheduler scheduler = await schedulerFactory.GetScheduler(); await scheduler.Start(); // 绑定任务 IJobDetail job = JobBuilder.Create<YourCustomJob>() .WithIdentity("3DayIntervalJob", "defaultGroup") .Build(); // 分别创建8、9、10点的3天间隔触发器 var triggerList = new List<ITrigger>(); int[] triggerHours = new[] {8,9,10}; foreach (var hour in triggerHours) { var trigger = TriggerBuilder.Create() .WithIdentity($"trigger_{hour}h", "defaultGroup") // 替换为你需要的起始生效时间 .StartAt(new DateTimeOffset(new DateTime(2021,9,17,hour,0,0))) .WithCalendarIntervalSchedule(x => { x.WithIntervalInDays(3); // 夏令时切换时也保持小时数不变,避免执行时间偏移 x.PreserveHourOfDayAcrossDaylightSavings(true); }) .Build(); triggerList.Add(trigger); } // 注册任务和触发器 await scheduler.ScheduleJob(job, triggerList, replace: true); }
验证方法
你可以通过以下代码查询未来10次的触发时间,确认规则是否符合预期:
var nextFireTimes = TriggerUtils.ComputeFireTimes(triggerList.First(), null, 10); foreach (var time in nextFireTimes) { Console.WriteLine(time.LocalDateTime); }
方案2:Cron表达式实现(适合不需要严格跨月间隔的场景)
如果你的业务可以接受按自然月每3天触发(即当月1、4、7...日触发,月底到下月初可能出现间隔超过3天的情况),可以使用单个Cron触发器,表达式为0 0 8,9,10 */3 * ?。
代码示例
ITrigger cronTrigger = TriggerBuilder.Create() .WithIdentity("cronTrigger", "defaultGroup") .StartNow() .WithCronSchedule("0 0 8,9,10 */3 * ?") .Build(); await scheduler.ScheduleJob(job, cronTrigger);
内容的提问来源于stack exchange,提问作者nobody
相关产品推荐
相关产品推荐

