C# (.NET) 任务调度器:从简单定时器到企业级 Quartz.NET
任务调度器 (Task Scheduler) 是任何严肃应用程序不可或缺的组成部分。无论是定期清理缓存、发送邮件推送,还是与外部 API 同步数据,都离不开可靠的后台操作执行机制。在 .NET 生态系统中,开发者可以使用多种方法:从内置的 System.Threading.Timer 到强大且灵活的 Quartz.NET 框架。本文将详细解析这两种方案,展示代码示例,并帮助您为项目选择合适的工具。
1. 内置的 System.Threading.Timer
按计划启动任务最简单、最轻量的方式是使用 System.Threading.Timer。它无需安装第三方包,非常适合简单场景:按固定间隔执行方法或单次延迟执行。
示例:每 5 秒执行一次任务
using System;using System.Threading;
class Program{ static void Main() { // 创建一个定时器,每 5 秒执行一次回调 Timer timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5)); Console.WriteLine("定时器已启动。按 Enter 键退出。"); Console.ReadLine(); timer.Dispose(); }
static void DoWork(object state) { Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] 正在执行后台任务..."); }}优点:
- 内置于 .NET,无需额外库。
- 资源消耗极低。
- 使用简单。
缺点:
- 没有内置的 CRON 表达式支持。
- 难以管理多个具有不同计划的任务。
- 没有持久化机制(重启后任务丢失)。
- 回调在线程池中执行,可能存在同步问题。
对于学习项目和简单工具,System.Threading.Timer 是不错的选择。但对于包含数十个任务的生产级应用程序,建议考虑更高级的解决方案。
2. Quartz.NET — 企业级任务调度器
Quartz.NET 是一个强大、灵活且成熟的 .NET 任务调度框架。它受流行的 Java 版 Quartz 启发,支持:
- CRON 表达式实现灵活调度(每隔两小时、工作日早上 9:00 等)。
- 任务持久化(保存到数据库)。
- 集群支持(多台服务器可执行任务)。
- 错过任务处理 (misfire handling)。
- 子任务和触发器。
安装 Quartz.NET
通过 NuGet 安装包:
dotnet add package Quartz示例:使用 CRON 调度的简单任务
using System;using System.Threading.Tasks;using Quartz;using Quartz.Impl;
class Program{ static async Task Main() { // 创建调度器 StdSchedulerFactory factory = new StdSchedulerFactory(); IScheduler scheduler = await factory.GetScheduler(); await scheduler.Start();
// 定义任务 (Job) IJobDetail job = JobBuilder.Create<HelloJob>() .WithIdentity("helloJob", "group1") .Build();
// 创建触发器:每天早上 10:30 ITrigger trigger = TriggerBuilder.Create() .WithIdentity("trigger1", "group1") .WithCronSchedule("0 30 10 ? * * *") // CRON: 秒, 分, 时, 日, 月, 星期 .Build();
// 注册任务与触发器 await scheduler.ScheduleJob(job, trigger);
Console