• Stars
    star
    164
  • Rank 228,904 (Top 5 %)
  • Language
    C#
  • Created about 2 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

轻量化定时任务调度,支持临时的延时任务和重复循环任务(可持久化),可按秒,每天/每周/每月固定时间,自定义间隔执行,支持 .NET Core 2.1+、.NET Framework 4.0+ 运行环境。

FreeScheduler 是利用 IdleBus 实现的轻量化定时任务调度,支持临时的延时任务和重复循环任务(可持久化),可按秒,每天/每周/每月固定时间,自定义间隔执行,支持 .NET Core 2.1+、.NET Framework 4.0+ 运行环境。

IdleScheduler 已正式改名为 FreeScheduler

如果对本项目感兴趣,欢迎加入 FreeSql QQ讨论群:8578575

Quick start

dotnet add package FreeScheduler

Install-Package FreeScheduler

static Lazy<Scheduler> _schedulerLazy = new Lazy(() => new Scheduler(new MyTaskHandler()));
static Scheduler scheduler => _schedulerLazy.Value;

0、临时任务(不可持久化)

void Callback()
{
    Console.WriteLine("时间到了");
    scheduler.AddTempTask(TimeSpan.FromSeconds(10), Callback); //下一次定时
}

scheduler.AddTempTask(TimeSpan.FromSeconds(10), Callback);
Method 说明
string AddTempTask(TimeSpan, Action) 创建临时的延时任务,返回 id
bool RemoveTempTask(string id) 删除任务(临时任务)
bool ExistsTempTask(string id) 判断任务是否存在(临时任务)
int QuantityTempTask 任务数量(临时任务)
int ScanInterval 扫描线程间隔(默认值:200毫秒),值越小触发精准,试试 1ms

1、普通任务

class MyTaskHandler : FreeScheduler.TaskHandlers.TestHandler
{
    public override void OnExecuting(Scheduler scheduler, TaskInfo task)
    {
        //todo..
    }
}

2、持久化任务

// 使用 FreeSql 持久化任务
class MyTaskHandler : FreeScheduler.TaskHandlers.FreeSqlHandler
{
    public MyTaskHandler(IFreeSql fsql) : base(fsql) { }

    public override void OnExecuting(Scheduler scheduler, TaskInfo task)
    {
        Console.WriteLine($"[{DateTime.Now.ToString("HH:mm:ss.fff")}] {task.Topic} 被执行");

        //强制使任务完成
        //task.Status = TaskStatus.Completed;
    }
}

Redis 持久化请安装:

dotnet add package FreeScheduler.TaskHandlers.FreeRedis

Install-Package FreeScheduler.TaskHandlers.FreeRedis

3、管理任务

// 使用 FreeSql 或者 SQL 查询 TaskInfo、TaskLog 两个表进行分页显示
fsql.Select<TaskInfo>().Count(out var total).Page(pageNumber, 30).ToList();
fsql.Select<TaskLog>().Count(out var total).Page(pageNumber, 30).ToList();

//暂停任务
scheduler.PauseTask(id);
//恢复暂停的任务
scheduler.ResumeTask(id);
//删除任务
scheduler.RemoveTask(id);
//立刻运行任务(人工触发)
scheduler.RunNowTask(id);

API (循环任务/可持久化)

Method 说明
void ctor(ITaskHandler) 指定任务调度器(单例)
string AddTask(string topic, string body, int round, int seconds) 创建循环定时任务,返回 id
string AddTask(string topic, string body, int[] seconds) 创建每轮间隔不同的定时任务,返回 id
string AddTaskRunOnDay(..) 创建每日循环任务,指定utc时间,返回 id
string AddTaskRunOnWeek(..) 创建每周循环任务,指定utc时间,返回 id
string AddTaskRunOnMonth(..) 创建每月循环任务,指定utc时间,返回 id
string AddTaskCustom(string topic, string body, string expression) 创建自定义任务,返回 id
bool RemoveTask(string id) 删除任务
bool ExistsTask(string id) 判断任务是否存在
bool ResumeTask(string id) 恢复已暂停的任务
bool PauseTask(string id) 暂停正在运行的任务
bool RunNowTask(string id) 立刻运行任务(人工触发)
TaskInfo[] FindTask(lambda) 查询正在运行中的任务
int QuantityTask 任务数量
//每5秒触发,执行N次
var id = scheduler.AddTask("topic1", "body1", round: -1, 5);

//每次 不同的间隔秒数触发,执行6次
var id = scheduler.AddTask("topic1", "body1", new [] { 5, 5, 10, 10, 60, 60 });

//每天 20:00:00 触发,指定utc时间,执行N次
var id = scheduler.AddTaskRunOnDay("topic1", "body1", round: -1, "20:00:00");

//每周一 20:00:00 触发,指定utc时间,执行1次
var id = scheduler.AddTaskRunOnWeek("topic1", "body1", round: 1, "1:20:00:00");

//每月1日 20:00:00 触发,指定utc时间,执行12次
var id = scheduler.AddTaskRunOnMonth("topic1", "body1", round: 12, "1:20:00:00");

//自定义间隔
var id = scheduler.AddTaskCustom("topic1", "body1", "0/1 * * * * ? ");
class MyCustomTaskHandler : FreeScheduler.ITaskIntervalCustomHandler
{
    public TimeSpan? NextDelay(TaskInfo task)
    {
        //利用 cron 功能库解析 task.IntervalArgument 得到下一次执行时间
        //与当前时间相减,得到 TimeSpan,若返回 null 则任务完成
        return TimeSpan.FromSeconds(5);
    }
}

Performance

FreeScheduler Quartz.net FluentScheduler HashedWheelTimer
(500,000 Tasks + 10s) (500,000 Tasks + 10s) (500,000 Tasks + 10s) (500,000 Tasks + 10s)
383M 1700+M StackOverflow 213M
70563.6066ms 50692.5365ms 未知 33697.8758ms

FluentScheduler 单个 Registry 测试正常,但目测单线程执行(间隔1-10ms),处理速度不理想 View Code

我尝试把 FreeScheduler 内核改成 HashedWheelTimer 内存占用更高(600兆),结论:FreeScheduler 功能需要占用更多资源

💕 Donation (捐赠)

感谢你的打赏

🗄 License (许可证)

MIT

More Repositories

1

csredis

.NET Core or .NET Framework 4.0+ client for Redis and Redis Sentinel (2.8) and Cluster. Includes both synchronous and asynchronous clients.
C#
1,907
star
2

FreeIM

.NETCore websocket 实现简易、高性能、集群即时通讯组件,支持点对点通讯、群聊通讯、上线下线事件消息等众多实用性功能.
C#
1,223
star
3

FreeRedis

🦄 FreeRedis is .NET40+ redis client. supports cluster, sentinel, master-slave, pub-sub, lua, pipeline, transaction, streams, client-side-caching, and pooling.
C#
903
star
4

dotnetGen_mysql

.NETCore + Mysql 生成器
C#
242
star
5

FreeSql.Tools

FreeSql 工具包,包括生成器等
C#
212
star
6

FreeSql.AdminLTE

这是一个 .NETCore MVC 中间件,基于 AdminLTE 前端框架动态产生 FreeSql 实体的增删查改界面。
C#
166
star
7

dotnetGen_sqlserver

.NETCore + SqlServer 生成器
C#
149
star
8

SafeObjectPool

应用场景:连接池,资源池等等
C#
112
star
9

IdleBus

IdleBus 空闲对象管理容器,有效组织对象重复利用,自动创建、销毁,解决【实例】过多且长时间占用的问题。
C#
107
star
10

dotnetGen_postgresql

.NETCore + PostgreSQL 生成器
C#
94
star
11

NPinyin

拼音汉字转换 .NETCore 版本
C#
80
star
12

FreeSql.Cloud

提供跨数据库访问,分布式事务TCC、SAGA解决方案。
C#
65
star
13

Microsoft.Extensions.Caching.CSRedis

分布式缓存,替代 Microsoft.Extensions.Caching.Redis
C#
44
star
14

FreeSql.DbContext

FreeSql 扩展包,实现真正的 ORM,Repository DbContext UnitOfWork 实现。
C#
41
star
15

FreeSql.DynamicProxy

The dynamic proxy on The .NetCore or .NetFramework4.0+. Support asynchronous method interception, Method parameter interception, Property interception, multiple intercepts, dependency injection and inversion of control
C#
38
star
16

TcpClientHttpRequest

基于 TcpClient 现实的 http请求库,编写于2007年做了几年数据采集工作。
C#
34
star
17

NJob

超级轻便的调度器
C#
30
star
18

FreeSql.Wiki.VuePress

FreeSql wiki 文档采用 vuepress
Dockerfile
30
star
19

MySocket

Socket服务端与客户端的封装(IOCP、EPOLL),支持.NETCore
C#
28
star
20

WorkQueue

超级轻便的线程队列工作器
C#
25
star
21

ojbk

模块化的单体应用项目
JavaScript
21
star
22

dotnetGen

.NET Framework 3.0 + SqlServer 生成器(停止更新)
C#
17
star
23

genms_shop

.NETCore 快速开发做一个简易商城
JavaScript
13
star
24

FreeSql.Connection.Extensions

Mysql, postgresql, sqlserver, Oracle and SQLite connection object extension methods.
C#
10
star
25

dng.Mysql

dotnetgen_mysql生成器所需MySql.Data的基础封装
C#
6
star
26

bmw.js

JavaScript
6
star
27

robot_test

简易任务调度
C#
6
star
28

dotnetGen_demo

dotnetGen 生成后的项目示例
C#
5
star
29

dng.Mssql

dotnetgen_sqlserver生成器所需System.Data.SqlClient的基础封装
C#
4
star
30

oss_signature

阿里云OSS服务端签名后直传,模仿官方get.php代码实现
C#
4
star
31

Spider

爬虫工具,.NET2.0实现
C#
4
star
32

AdminBlazor

AdminBlazor 是一款 Blazor SSR 后台管理项目,支持 RABC 权限菜单/按钮,支持一对一、一对多、多对多代码生成 .razor 界面。
HTML
4
star
33

dng.Pgsql

dotnetgen_postgresql生成器所需npgsql的基础封装
C#
3
star
34

dng.Template

模板引擎,不再使用(作纪念)
C#
3
star
35

cnodejs_netcore

.NETCore + MySql 实现的 cnodejs.org
JavaScript
2
star