C# (.NET) 任务调度器:Quartz.NET、Hangfire 和 Coravel
在现代 .NET 应用程序中,经常需要不仅根据用户请求执行代码,还要按计划执行:发送邮件简报、清理数据库、生成报告、与外部 API 同步。为此,需要使用任务调度器 (Job Schedulers)。在本文中,我们将介绍三种流行的 C# (.NET) 工具:Quartz.NET、Hangfire 和 Coravel,以及它们的特点、代码示例和使用场景。
为什么在 .NET 中需要任务调度器?
任务调度器允许:
- 在特定时间执行后台任务(例如,每天 8:00)。
- 按指定间隔重复任务(每 5 分钟)。
- 处理任务队列,而不阻塞应用程序的主线程。
- 轻松管理任务(添加、删除、暂停)。
- 提供容错能力(出错时重试)。
1. Quartz.NET — 强大且灵活的调度器
Quartz.NET 是流行的 Java 框架 Quartz 在 .NET 上的移植版。它支持复杂的调度(cron 表达式)、集群、将任务持久化到数据库。适用于企业级项目。
安装
dotnet add package Quartzdotnet add package Quartz.Extensions.Hosting示例:使用 cron 调度的任务
using Quartz;using Quartz.Impl;using System.Threading.Tasks;
public class EmailJob : IJob{ public async Task Execute(IJobExecutionContext context) { Console.WriteLine($"在 {DateTime.Now} 发送邮件"); // 发送邮件的逻辑 await Task.CompletedTask; }}
// 在 Program.cs 中配置var scheduler = await StdSchedulerFactory.GetDefaultScheduler();await scheduler.Start();
var job = JobBuilder.Create<EmailJob>() .WithIdentity("emailJob", "group1") .Build();
var trigger = TriggerBuilder.Create() .WithIdentity("emailTrigger", "group1") .WithCronSchedule("0 0 8 * * ?") // 每天 8:00 .Build();
await scheduler.ScheduleJob(job, trigger);特点
- 支持 cron 表达式(灵活的调度)。
- 适用于分布式系统的集群功能。
- 持久化(重启后任务得以保留)。
- 处理数千个任务时的高性能。
2. Hangfire — 简单易用且内置 UI
Hangfire 是一个配置极简且内置 Web 面板用于监控任务的调度器。非常适合需要快速集成的小型和中等规模项目。
安装
dotnet add package Hangfiredotnet add package Hangfire.SqlServer (用于数据库存储)示例:带延迟和重复的简单任务
using Hangfire;using Hangfire.SqlServer;
// 在 Program.cs 中配置GlobalConfiguration.Configuration .UseSqlServerStorage("YourConnectionString");
app.UseHangfireServer();app.UseHangfireDashboard(); // 访问 /hangfire
// 创建任务BackgroundJob.Schedule(() => Console.WriteLine("延迟任务"), TimeSpan.FromMinutes(5));RecurringJob.AddOrUpdate("daily-report", () => Console.WriteLine("每日报告"), Cron.Daily);特点
- 内置 Web 界面用于监控(无需额外依赖)。
- 支持队列、重试和延迟任务。
- 易于与 ASP.NET Core 集成。
- 任务可存储在 SQL Server、Redis、PostgreSQL 中。
3. Coravel — 轻量且现代
Coravel 是一个受 Laravel 启发的 .NET 极简调度器。无需外部依赖