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.NETFluentScheduler
部署成本高(需操作操作系统)低(代码集成)极低(单文件引用)
调度精度分钟级毫秒级秒级
复杂度高(学习曲线陡峭)极低(流式语法)
存储支持注册表/文件支持数据库持久化仅限内存

4. 进阶:如何处理“任务重叠”?#

如果一个任务每 5 秒运行一次,但任务本身执行了 10 秒,该库默认会并行运行。如果你希望同一时间只运行一个实例,可以这样配置:

// 确保任务在同一时间只有一个实例在运行(防止资源竞态)
Schedule<MyJob>().NonReentrant().ToRunEvery(5).Seconds();

5. 总结与温馨提示#

FluentScheduler 是轻量级、内存级调度的最佳选择。它不需要配置数据库,不需要处理复杂的 Cron 表达式,非常适合后台简单的数据清理、状态检查或轻量级同步任务。

⚠️ 注意:该库目前在 GitHub 上已处于非活跃维护状态。对于极其复杂的、需要集群支持或任务持久化的企业级场景,建议关注 Quartz.NETHangfire。但对于大多数中小型项目,FluentScheduler 依然是性能与开发效率的平衡点。

FluentScheduler:C# 中的任务调度神器
https://sw.rscclub.website/posts/csharpfluentscheduler/
作者
杨月昌
发布于
2018-12-18
许可协议
CC BY-NC-SA 4.0