你是不是还在用 System.Timers.Timer 或 Threading.Timer 来做定时任务?
如果你的任务越来越复杂、业务越来越多,或者有多实例部署需求,Timer 很可能已经力不从心了。
今天,我们来看看 Quartz.NET,它在 .NET 6 环境下如何帮你轻松实现可靠、高效的定时任务。
为什么 Quartz 比 Timer 更好?
-
支持 Cron 表达式 或固定间隔调度
-
内置 并发控制(避免同一个任务同时运行)
-
可以 持久化任务状态,支持集群环境
-
多任务、多 Trigger、复杂调度都轻松搞定
简单来说,如果 Timer 是“小刀”,Quartz 就是“瑞士军刀”——功能强大,能应对各种复杂场景。
操作步骤
1️⃣ 安装 NuGet 包
在项目里通过 NuGet 安装两个必要包:
dotnet add package Quartz
dotnet add package Quartz.Extensions.Hosting

2️⃣ 定义 Job(任务)
using Quartz;
using System;
using System.IO;
using System.Threading.Tasks;
// 防止并发(告诉 Quartz 不要并发地执行同一个 JobDetail 实例)
[DisallowConcurrentExecution]
public class HelloQuartzJob : IJob
{
public Task Execute(IJobExecutionContext context)
{
// 日志内容
string log = $"Hello Quartz {DateTime.Now:yyyy-MM-dd HH:mm:ss}{Environment.NewLine}";
// 文件路径
string filePath = @"D:\\QuartzLog.txt";
// 追加写入(不会覆盖之前日志)
File.AppendAllText(filePath, log);
//因为 Execute 返回 Task 类型,但这个 Job 没有异步操作,直接返回已完成的 Task
return Task.CompletedTask;
}
}
3️⃣ 注册 Quartz 并添加 Trigger
builder.Services.AddQuartz(q =>
{
var jobKey = new JobKey("HelloQuartzJob");
// 注册 Job
q.AddJob<HelloQuartzJob>(opts =>
opts.WithIdentity(jobKey)
);
// 注册 Trigger:每 5 分钟执行一次
q.AddTrigger(opts => opts
.ForJob(jobKey)
.WithIdentity("HelloQuartzJob-trigger")
.WithSimpleSchedule(x => x
.WithIntervalInMinutes(5)
.RepeatForever())
);
});
4️⃣ 注入 QuartzHostedService(自动执行)
builder.Services.AddQuartzHostedService(options =>
{
options.WaitForJobsToComplete = true;
});
-
AddQuartzHostedService
-
让 Quartz 随应用启动和停止
-
-
WaitForJobsToComplete = true
-
应用退出时会等待正在运行的任务完成再停止,保证任务安全
-
5️⃣ 运行效果
启动项目
每隔 5 分钟,Quartz 自动执行 HelloQuartzJob
打开 D:\\QuartzLog.txt,你会看到类似:
Hello Quartz 2026-01-28 15:05:00
Hello Quartz 2026-01-28 15:10:00
Hello Quartz 2026-01-28 15:15:00
完美替代 Timer,任务稳定可靠,支持并发控制和扩展
除了单个任务,你还能用 Quartz 做什么?
1.多任务调度
Quartz 可以同时管理 多个 Job,每个 Job 可以有自己的 Trigger
// JobA: 每 5 分钟执行
q.AddJob<JobA>(opts => opts.WithIdentity("JobA"));
q.AddTrigger(t => t.ForJob("JobA")
.WithIdentity("JobA-trigger")
.WithSimpleSchedule(x => x.WithIntervalInMinutes(5).RepeatForever()));
// JobB: 每天凌晨 1 点执行
q.AddJob<JobB>(opts => opts.WithIdentity("JobB"));
q.AddTrigger(t => t.ForJob("JobB")
.WithIdentity("JobB-trigger")
.WithCronSchedule("0 0 1 * * ?"));
2.一个 Job,多 Trigger
var jobKey = new JobKey("ReportJob");
q.AddJob<ReportJob>(opts => opts.WithIdentity(jobKey));
// 每天 3 点
q.AddTrigger(t => t.ForJob(jobKey)
.WithIdentity("DailyTrigger")
.WithCronSchedule("0 0 3 * * ?"));
// 每小时
q.AddTrigger(t => t.ForJob(jobKey)
.WithIdentity("HourlyTrigger")
.WithSimpleSchedule(x => x.WithIntervalInHours(1).RepeatForever()));
总的来说,Quartz.NET 是一个功能强大、灵活可靠的定时任务框架。无论是 定时更新数据库、生成报表、发送通知,还是执行批量数据处理,它都能轻松胜任。
相比传统的 Timer 或自定义循环,Quartz 提供了 多任务调度、并发控制、持久化、集群支持 等优势,使你的定时任务更加稳定、高效。对于任何需要长期稳定执行、复杂规则或多任务并行的业务场景,它都是非常适合的选择。
网硕互联帮助中心


评论前必须登录!
注册