835 字
4 分钟
FluentScheduler:C# 中的任务调度神器
在开发自动化任务时,很多开发者可能会遇到需要定时执行某些操作的场景。传统的做法是将程序打包成 EXE,然后使用 Windows Task Scheduler。然而,这种方案在处理“秒级”高频任务、动态任务修改或跨平台部署时显得力不从心。
今天推荐的 FluentScheduler 是一个轻量级、零依赖的 C# 任务调度库。它最大的特点是使用了 Fluent Interface(流式接口),让复杂的调度规则变得像写英语句子一样简单。
1. 核心架构与工作流程
FluentScheduler 的设计非常简洁,主要围绕三个核心组件展开:
- IJob:任务逻辑的载体(做什么)。
- Registry:任务注册表,存放所有的调度规则(什么时候做)。
- JobManager:调度指挥部,负责初始化、管理生命周期和执行任务。
2. 快速上手实战
步骤 A:定义具体任务
所有任务必须实现 IJob 接口。建议在 Execute 中添加 try-catch 块,防止单个任务崩溃导致整个进程受阻。
public class MyJob : IJob{ public void Execute() { // 建议添加日志记录和异常处理 Console.WriteLine($"[Job Executed] 当前时间: {DateTime.Now}"); }}步骤 B:配置调度注册表
这是 FluentScheduler 最迷人的地方,你可以用极度直观的语法定义规则:
public class MyRegistry : Registry{ public MyRegistry() { // 1. 立即执行,每 2 秒运行一次(高频任务) Schedule<MyJob>().ToRunNow().AndEvery(2).Seconds();
// 2. 指定时间执行(如每天晚上 9:15) Schedule(() => Console.WriteLine("每日结算任务开始...")) .ToRunEvery(1).Days().At(21, 15);
// 3. 复杂周期:每个月第一个周一的凌晨 3:00 Schedule<MyJob>().ToRunEvery(1).Months() .OnTheFirst(DayOfWeek.Monday).At(3, 0);
// 4. 任务链:MyJob 执行完后接着执行 MyOtherJob Schedule<MyJob>().AndThen<MyOtherJob>().ToRunEvery(5).Minutes(); }}步骤 C:在应用中启动
对于 ASP.NET 或是桌面程序,在启动入口调用一次初始化即可:
// 初始化并加载注册表JobManager.Initialize(new MyRegistry());
// 捕获任务异常的进阶配置JobManager.JobException += info => Logger.Error($"任务 {info.Name} 报错: {info.Exception}");3. FluentScheduler vs 其他方案
| 特性 | Windows 任务计划 | Quartz.NET | FluentScheduler |
|---|---|---|---|
| 部署成本 | 高(需操作操作系统) | 低(代码集成) | 极低(单文件引用) |
| 调度精度 | 分钟级 | 毫秒级 | 秒级 |
| 复杂度 | 中 | 高(学习曲线陡峭) | 极低(流式语法) |
| 存储支持 | 注册表/文件 | 支持数据库持久化 | 仅限内存 |
4. 进阶:如何处理“任务重叠”?
如果一个任务每 5 秒运行一次,但任务本身执行了 10 秒,该库默认会并行运行。如果你希望同一时间只运行一个实例,可以这样配置:
// 确保任务在同一时间只有一个实例在运行(防止资源竞态)Schedule<MyJob>().NonReentrant().ToRunEvery(5).Seconds();5. 总结与温馨提示
FluentScheduler 是轻量级、内存级调度的最佳选择。它不需要配置数据库,不需要处理复杂的 Cron 表达式,非常适合后台简单的数据清理、状态检查或轻量级同步任务。
⚠️ 注意:该库目前在 GitHub 上已处于非活跃维护状态。对于极其复杂的、需要集群支持或任务持久化的企业级场景,建议关注 Quartz.NET 或 Hangfire。但对于大多数中小型项目,FluentScheduler 依然是性能与开发效率的平衡点。
FluentScheduler:C# 中的任务调度神器
https://sw.rscclub.website/posts/csharpfluentscheduler/