云计算百科
云计算领域专业知识百科平台

告别 Timer!.NET 6 高效定时任务从 Quartz 开始

你是不是还在用 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 提供了 多任务调度、并发控制、持久化、集群支持 等优势,使你的定时任务更加稳定、高效。对于任何需要长期稳定执行、复杂规则或多任务并行的业务场景,它都是非常适合的选择。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 告别 Timer!.NET 6 高效定时任务从 Quartz 开始
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!