Quartz.NET 和 Hangfire 都能定时执行任务,但底层设计目标完全不同
Quartz.NET 是纯调度引擎,只管“什么时候执行”,不提供执行环境、持久化存储或管理界面;Hangfire 则是开箱即用的任务平台,自带存储(SQL Server / Redis)、后台 Dashboard、重试、延迟队列和分布式锁支持。选哪个,取决于你是否愿意自己搭轮子。
需要持久化、失败重试、可视化监控?直接上 Hangfire
Hangfire 默认把任务元数据存进数据库(
Job、
State、
Server等表),失败后自动进入
Failed状态并支持手动重试;它的 Dashboard 页面能实时查看队列长度、正在运行的作业、历史执行日志。Quartz.NET 要实现同样能力,得自己集成
AdoJobStore+ 写 UI + 实现失败回调逻辑。
常见场景下推荐 Hangfire:
业务系统中需要人工介入失败任务(比如支付回调超时后重推) 团队没有专职运维,又希望快速看到“哪些任务卡住了” 任务执行时间不确定(如调第三方 API),需依赖 Hangfire 的BackgroundJob.Enqueue或
RecurringJob.AddOrUpdate
需要精确到毫秒级调度、复杂触发规则、或跨平台非 .NET 执行器?Quartz.NET 更合适
Quartz.NET 支持 Cron 表达式、
SimpleTrigger、
CalendarIntervalTrigger,还能用
ICalendar排除节假日;它不绑定具体执行环境,可配合 RabbitMQ 或自定义 Transport 把任务发给 Java/Python 进程处理。Hangfire 的 Cron 仅支持标准格式(不支持年份、不支持
1/3步长写法),且所有任务必须由 .NET 进程执行。
典型 Quartz.NET 使用点:
金融系统要求每 500ms 检查一次订单状态(SimpleTrigger设置
RepeatInterval = 500) 排班系统需避开法定节假日(实现
BaseCalendar子类并注册) 已有 Java 调度中心,.NET 只负责生成任务描述 JSON 并投递到 Kafka
部署和扩展性差异直接影响维护成本
Hangfire 天然支持多工作节点(多个 Web 应用实例连接同一数据库即可共享队列),但所有节点共用一个
JobStorage,写入竞争高时可能拖慢 Dashboard 响应;Quartz.NET 的集群模式依赖数据库行锁(
QRTZ_LOCKS表),节点数超过 5 个后容易出现抢锁失败(
ObjectAlreadyExistsException或调度延迟)。两者都不建议在单机 SQLite 上跑生产环境。
实际选型注意:
若已用 SQL Server,Hangfire 的SqlServerStorage开箱即用;Quartz.NET 需手动建 11 张表(脚本在
quartznet\database\tables目录) Hangfire 的内存占用明显更高(每个 BackgroundJob 对象含完整序列化上下文),高频短任务(如每秒 100+)建议压测
Dashboard页面是否卡顿 Quartz.NET 的
IScheduler实例不能跨 AppDomain 共享,IIS 应用池回收会导致调度中断,必须配合 Windows Service 或
dotnet watch外部守护
var options = new SqlServerStorageOptions
{
QueuePollInterval = TimeSpan.FromSeconds(1),
TransactionTimeout = TimeSpan.FromMinutes(5)
};
GlobalConfiguration.Configuration.UseSqlServerStorage("conn_str", options); // Hangfirevar scheduler = await StdSchedulerFactory.GetDefaultScheduler();
await scheduler.Start();
var job = JobBuilder.Create<MyJob>().Build();
var trigger = TriggerBuilder.Create()
.WithSchedule(CronScheduleBuilder.CronSchedule("0 0/5 * * * ?")) // 每5分钟
.Build();
await scheduler.ScheduleJob(job, trigger); // Quartz.NETQuartz.NET 的调度精度和规则灵活性是硬优势,Hangfire 的工程友好性是真实生产力。别纠结“谁更好”,先问清楚:你的下一次线上故障,是更怕调度不准,还是更怕查不出为什么没执行。
