C# (.NET) 任务调度器:Quartz.NET 与 System.Threading.Timer

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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

推荐