C# (.NET) 任务调度器:概览与示例
在现代 C# (.NET) 开发中,经常需要按计划执行代码:发送邮件推送、更新缓存、归档日志或启动 ETL 流程。为此,存在专门的库——任务调度器 (Job Schedulers)。本文将介绍三种流行的解决方案:Quartz.NET、Hangfire 和 Coravel,并提供使用示例。
1. Quartz.NET——强大且灵活的调度器
Quartz.NET 是流行 Java 框架 Quartz 的移植版本。它支持使用 cron 表达式进行复杂调度、任务持久化到数据库、集群以及触发器。
安装
dotnet add package Quartz示例:带 cron 调度的简单任务
using Quartz;using Quartz.Impl;
public class HelloJob : IJob{ public async Task Execute(IJobExecutionContext context) { Console.WriteLine($"你好!时间:{DateTime.Now}"); }}
// 配置调度器ISchedulerFactory schedulerFactory = new StdSchedulerFactory();IScheduler scheduler = await schedulerFactory.GetScheduler();
// 定义任务IJobDetail job = JobBuilder.Create<HelloJob>() .WithIdentity("helloJob", "group1") .Build();
// 触发器:每 10 秒ITrigger trigger = TriggerBuilder.Create() .WithIdentity("trigger1", "group1") .WithCronSchedule("0/10 * * * * ?") // 每 10 秒 .ForJob(job) .Build();
await scheduler.ScheduleJob(job, trigger);await scheduler.Start();特点:
- 支持 cron 表达式(例如
0 0 12 * * ?——每天中午)。 - 任务存储于 ADO.NET(SQL Server、PostgreSQL、MySQL)。
- 支持动态创建/删除任务。
- 集群支持以实现高可用性。
2. Hangfire——简单易用,内置仪表盘
Hangfire 是一个以最少配置执行后台任务的库。它提供内置的 Web 仪表盘用于监控、错误重试以及与 ASP.NET Core 的集成。
安装
dotnet add package Hangfiredotnet add package Hangfire.SqlServer # 用于存储在 SQL Server 中示例:延迟任务与周期性任务
using Hangfire;
// 在 Startup.cs 中配置public void ConfigureServices(IServiceCollection services){ services.AddHangfire(config => config.UseSqlServerStorage("connection_string")); services.AddHangfireServer();}
public void Configure(IApplicationBuilder app){ app.UseHangfireDashboard(); // /hangfire // 周期性任务:每 5 分钟 RecurringJob.AddOrUpdate( "cleanup-cache", () => Console.WriteLine("清理缓存..."), "*/5 * * * *"); // 延迟任务(1 小时后) BackgroundJob.Schedule( () => SendEmail("user@example.com"), TimeSpan.FromHours(1));}
public void SendEmail(string email){ Console.WriteLine($"发送邮件至 {email}");}优势:
- 内置仪表盘(
/hangfire)用于查看任务状态。 - 失败时自动重试。
- 支持队列(默认使用 Redis 或 SQL Server)。
- 通过 DI 与 ASP.NET Core 轻松集成。
3. Coravel——轻量级 .NET Core 调度器
Coravel 是一个极简库,无需外部依赖(仅需 .NET 本身)。它非常适合不需要持久化的小型项目。
安装
dotnet add