.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的测试. 或许有些人会认为, ...
随机推荐
- 技术分析 | 浅谈在MySQL体系下SQL语句是如何在系统中执行的及可能遇到的问题
欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 SQL语句大家并不陌生,但某种程度上来看,我们只是知道了这条语句是什么功能,它可 ...
- 我和Apache DolphinScheduler的这一年
Apache DolphinScheduler,为Apache开源项目, 简称"DS", 中文名 "小海豚调度"(海豚聪明.人性化,又左右脑可互相换班,终生不用 ...
- 大家都能看得懂的源码(一)ahooks 整体架构篇
本文是深入浅出 ahooks 源码系列文章的第一篇,该系列已整理成文档-地址.觉得还不错,给个 star 支持一下哈,Thanks. 第一篇主要介绍 ahooks 的背景以及整体架构. React h ...
- Hive存储格式之RCFile详解,RCFile的过去现在和未来
我在整理Hive的存储格式和压缩格式,本来打算一篇发出来,结果其中一小节就有很多内容,于是打算写成Hive存储格式和压缩格式系列. 本节主要讲一下Hive存储格式最早的典型的列式存储格式RCFile. ...
- MyBatis-Plus(二、常用注解)
1.@TableName @TableName 用法:映射数据库的表名,如果数据库表名与实体类名不一致,用@TableName来映射. package com.example.mybatisplus. ...
- 利用 Word 表格对文字、图文进行排版
在以前,Web 前端工程师利用 <table /> 元素对网页布局进行排版,但是如今却不推荐此元素排版了,而是改用 <div /> 元素和 CSS 弹性布局(或网格布局)对网页 ...
- Linux—进程管理
Linux 进程管理 1.进程管理介绍 1.1 什么是进程? 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础. 简而言之 ...
- HTML引用CSS实现自适应背景图
链接图片背景代码 body {background: url('链接') no-repeat center 0;} 颜色代码 body{background:#FFF} 链接图片背景代码2 <b ...
- 【java】学习路径37-练习:任意文件的复制
使用字节完成复制 import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException ...
- 【Java】学习路径34-文件IO练习题
练习题: 1.检测某目录(scr目录为例)下java源程序文件的数量. 参考思路: 首先获取到scr目录,然后使用list()获取所有名字,再使用String类下的endsWith方法检查即可. 参考 ...