You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Quartz.net实现每3天一次、当日8-10点每小时执行的任务调度

Quartz.NET 实现指定调度规则的方案

你的调度规则可以通过两种方式实现,分别适配不同的场景需求:

方案1:严格72小时间隔(推荐,完全匹配示例要求)

不受月份天数影响,固定每3天(72小时)触发,触发当日8、9、10点各执行一次。

实现步骤

  1. 首先安装Quartz.NET依赖
# Nuget包管理器命令
Install-Package Quartz
# 或者dotnet CLI命令
dotnet add package Quartz
  1. 编写调度代码
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 04:09:05