.NET Core C#系列之XiaoFeng.Threading.JobScheduler作业调度
作业调度其实就是一个定时器,定时完成某件事,
比如:每分钟执行一次,每小时执行一次,每天执行一次,第二周几执行,每月几号几点执行,间隔多少个小时执行一次等。
作业类:XiaoFeng.Threading.Job
主调度类:XiaoFeng.Threading.JobScheduler
先介绍一下 IJob接口
/// <summary>
/// 作业接口
/// </summary>
public interface IJob
{
#region 属性
/// <summary>
/// 当前调度
/// </summary>
IJobScheduler Scheduler { get; set; }
/// <summary>
/// 运行状态
/// </summary>
JobStatus Status { get; set; }
/// <summary>
/// 作业数据
/// </summary>
object State { get; set; }
/// <summary>
/// 是否是异步
/// </summary>
bool Async { get; set; }
/// <summary>
/// 已成功运行次数
/// </summary>
int SuccessCount { get; set; }
/// <summary>
/// 失败运行次数
/// </summary>
int FailureCount { get; set; }
/// <summary>
/// 运行日志
/// </summary>
List<string> Message { get; set; }
/// <summary>
/// 取消信号
/// </summary>
CancellationTokenSource CancelToken { get; set; }
/// <summary>
/// 作业ID
/// </summary>
Guid ID { get; }
/// <summary>
/// 作业名称
/// </summary>
string Name { get; set; }
/// <summary>
/// 运行次数
/// </summary>
int Count { get; }
/// <summary>
/// 成功回调
/// </summary>
Action<IJob> SuccessCallBack { get; set; }
/// <summary>
/// 当前任务执行完成后再进入计时队列 此方法最后一定要设置job的状态等待
/// </summary>
Action<IJob> CompleteCallBack { get; set; }
/// <summary>
/// 失败回调
/// </summary>
Action<IJob, Exception> FailureCallBack { get; set; }
/// <summary>
/// 停止作业回调
/// </summary>
Action<IJob> StopCallBack { get; set; }
/// <summary>
/// 最后一次运行时间
/// </summary>
DateTime? LastTime { get; set; }
/// <summary>
/// 下次运行时间
/// </summary>
DateTime? NextTime { get; set; }
/// <summary>
/// 启动时间
/// </summary>
DateTime? StartTime { get; set; }
/// <summary>
/// 最大运行次数
/// </summary>
int? MaxCount { get; set; }
/// <summary>
/// 过期时间
/// </summary>
DateTime? ExpireTime { get; set; }
/// <summary>
/// 运行完是否销毁
/// </summary>
bool IsDestroy { get; set; }
/// <summary>
/// 定时器类型
/// </summary>
TimerType TimerType { get; set; }
/// <summary>
/// 时间
/// </summary>
Time Time { get; set; }
/// <summary>
/// 间隔 单位毫秒
/// </summary>
int Period { get; set; }
/// <summary>
/// 几点,几号,周几(周日为一周的第一天),可用负数,-1代表一天中最后一小时即23点,一周内最后一天即周六,一月内最后一天
/// </summary>
int[] DayOrWeekOrHour { get; set; }
#endregion #region 启动作业
/// <summary>
/// 启动作业
/// </summary>
void Start();
/// <summary>
/// 启动作业
/// </summary>
/// <param name="scheduler">调度</param>
void Start(IJobScheduler scheduler);
#endregion #region 停止作业
/// <summary>
/// 停止作业
/// </summary>
void Stop();
/// <summary>
/// 停止作业
/// </summary>
/// <param name="scheduler">调度</param>
void Stop(IJobScheduler scheduler);
#endregion
}
接下来每种类型写一下实例
1.定时只执行一次也就是多久后执行
var job = new XiaoFeng.Threading.Job
{
Async = true,
Name="作业名称",
TimerType= XiaoFeng.Threading.TimerType.Once,
StartTime= DateTime.Now.AddMinutes(5),
SuccessCallBack = job =>
{
/*到时间执行任务*/
}
};
job.Start();
当前作业为5 分钟后执行一次,然后就是销毁,作业从调度中移除。
也可以用任务去实现当前功能如下代码:
Task.Factory.StartNew(() =>
{
/*等待5分钟*/
Task.Delay(5 * 60 * 1000).Wait();
/*执行作业任务*/
});
2.间隔执行
var job = new XiaoFeng.Threading.Job
{
Async = true,
Name = "作业名称",
TimerType = XiaoFeng.Threading.TimerType.Interval,
Period = 5000,
StartTime = DateTime.Now.AddMinutes(5),
SuccessCallBack = job =>
{
/*到时间执行任务*/
}
};
job.Start();
当前作业为,5分钟后运行,然后每隔5分钟会再执行一次
间隔执行就是每隔一段时间去执行一次任务,也可以用任务去实现当前功能,如下:
var cancelToken = new CancellationTokenSource();
Task.Factory.StartNew(() =>
{
while (!cancelToken.IsCancellationRequested)
{
/*等待5分钟*/
Task.Delay(5 * 60 * 1000).Wait();
/*执行作业任务*/
}
},TaskCreationOptions.LongRunning);
上边代码同样实现了每间隔5分钟执行一次作业任务
如果想取消当前任务直接调用 cancelToken.Cancel(); 这样就可以取消当前任务了。
3.每天定时执行一次
var job = new XiaoFeng.Threading.Job
{
Async = true,
Name = "作业名称",
TimerType = XiaoFeng.Threading.TimerType.Day,
Time = new XiaoFeng.Threading.Time(2, 0, 0),
StartTime = DateTime.Now.AddMinutes(5),
SuccessCallBack = job =>
{
/*到时间执行任务*/
}
};
当前作业为,5分钟后运行,然后每天2点执行一次
4.每周几几点执行,每月几号几点执行
var job = new XiaoFeng.Threading.Job
{
Async = true,
Name = "作业名称",
TimerType = XiaoFeng.Threading.TimerType.Week,
DayOrWeekOrHour = new int[] { 1, 4 },
Time = new XiaoFeng.Threading.Time(2, 0, 0),
StartTime = DateTime.Now.AddMinutes(5),
SuccessCallBack = job =>
{
/*到时间执行任务*/
}
};
job.Start();
当前作业为,5分钟后运行,然后每周的周一,四的2点执行一 次。
以上就是作业调度的简单使用。
开源地址:https://github.com/zhuovi/XiaoFeng/tree/master/Threading
语雀地址:https://www.yuque.com/fayelf/xiaofeng/yl8tkh
开源不易,多多支持~
.NET Core C#系列之XiaoFeng.Threading.JobScheduler作业调度的更多相关文章
- .NET Core C#系列之XiaoFeng.Data.IQueryableX ORM框架
当前对象操作数据库写法和EF Core极度类似,因为现在大部分程序员都懒得去写SQL,再一个就是项目作大了或其它原因要改数据库,每次改数据库,那么写的SQL语句大部分要作调整,相当麻烦,并且写SQ ...
- 《ASP.NET Core 高性能系列》致敬伟大的.NET斗士甲骨文!
写在开始 三年前,曾写过一篇文章:从.NET和Java之争谈IT这个行业,当时遭到某些自认为懂得java就了不起的Javaer抨击, 现在可以致敬伟大的.NET斗士甲骨文了 (JDK8以上都需要收费, ...
- EntityFramework Core 学习系列(一)Creating Model
EntityFramework Core 学习系列(一)Creating Model Getting Started 使用Command Line 来添加 Package dotnet add pa ...
- .net core实践系列之SSO-跨域实现
前言 接着上篇的<.net core实践系列之SSO-同域实现>,这次来聊聊SSO跨域的实现方式.这次虽说是.net core实践,但是核心点使用jquery居多. 建议看这篇文章的朋友可 ...
- .net core实践系列之短信服务-目录
前言 经过两周多的业余时间,终于把该系列的文章写完了.第一次写系列,可能部分关键点并没有覆盖到,如果有疑问的朋友可以随时反馈给我.另外也感谢在我发布文章时给予我方案建议与反馈源码BUG的朋友们.下面是 ...
- .net core实践系列之短信服务-架构设计
前言 上篇<.net core实践系列之短信服务-为什么选择.net core(开篇)>简单的介绍了(水了一篇).net core.这次针对短信服务的架构设计和技术栈的简析. 源码地址:h ...
- .net core实践系列之短信服务-为什么选择.net core(开篇)
前言 从今天我将会写.net core实战系列,以我最近完成的短信服务作为例子.该系列将会尽量以最短的时间全部发布出来.源码也将优先开源出来给大家. 源码地址:https://github.com/S ...
- .net core实践系列之短信服务-Sikiro.SMS.Api服务的实现
前言 上篇<.net core实践系列之短信服务-架构设计>介绍了我对短信服务的架构设计,同时针对场景解析了我的设计理念.本篇继续讲解Api服务的实现过程. 源码地址:https://gi ...
- .net core实践系列之短信服务-Api的SDK的实现与测试
前言 上一篇<.net core实践系列之短信服务-Sikiro.SMS.Api服务的实现>讲解了API的设计与实现,本篇主要讲解编写接口的SDK编写还有API的测试. 或许有些人会认为, ...
随机推荐
- AI智能剪辑,仅需2秒一键提取精彩片段
如今短视频已成为人们娱乐社交的主要形式,很多用户也开始由观众逐渐转变为短视频制作传播者,然而复杂的视频剪辑工具却令他们望而止步.如何才能降低短视频制作剪辑门槛,让更多无经验者也能制作出优质的短视频内容 ...
- 论文翻译:2022_Time-Frequency Attention for Monaural Speech Enhancement
论文地址:单耳语音增强的时频注意 引用格式:Zhang Q, Song Q, Ni Z, et al. Time-Frequency Attention for Monaural Speech Enh ...
- 技术分享 | ARM下中标麒麟系统ky10使用Xtrabackup-8.0.25
欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 一.需求背景 查询Percona官方手册,Xtrabackup 8.0可以备份M ...
- Point2和Point3类定义
支持以下图中的运算 类声明: class Point2 { public: Point2(); ~Point2(); Point2(ldouble a); Point2(ldouble a, ldou ...
- 设计模式(一)----设计模式概述及UML图解析
1.设计模式概述 1.1 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1977年美国著名建筑大师.加利福尼亚大学伯克利分校环境结构 ...
- Redis 04 列表
参考源 https://www.bilibili.com/video/BV1S54y1R7SB?spm_id_from=333.999.0.0 版本 本文章基于 Redis 6.2.6 在 Redis ...
- Canvas 线性图形(三):曲线
前言 画曲线要用到二次贝塞尔曲线或三次贝塞尔曲线.贝塞尔曲线是计算机图形学中相当重要的参数曲线,在一些比较成熟的位图软件中也有贝塞尔曲线工具,如 PhotoShop. 二次贝塞尔曲线 二次贝塞尔曲线在 ...
- 技术管理进阶——技术Leader需要数据思维
原创不易,求分享.求一键三连 假设我长得很漂亮,拥有众多追求者,但是初出闺房的我对这世界上的男人毫无认知,那么该如何选择呢?这真是一个问题! 妈妈说,愿意为我花钱的男人未必爱我,但不愿意为我花钱的男人 ...
- Codeforces 1503C Travelling Salesman Problem(Dynamic Programming)
题意 大家都是优秀生,这点英文还是看得懂的:点此看题 题解 由于旅行路线成一个环,所以从哪里出发不重要,我们把景点按照 a i a_i ai 排序,不妨就从左边最小的出发.基础的旅行费用 c i c ...
- Cannot resolve method 'println(java.lang.String)'
jsp文件中println爆红 <% int sum = 0; for (int i = 1; i <=100 ; i++) { sum+=i; } out.println("& ...