作业调度其实就是一个定时器,定时完成某件事,

比如:每分钟执行一次,每小时执行一次,每天执行一次,第二周几执行,每月几号几点执行,间隔多少个小时执行一次等。

作业类: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

开源不易,多多支持~

最新文章

  1. javaweb学习笔记之servlet01
  2. SpringMVC 用http请求的Get和Post请求作为路由的方法的重载方式
  3. struts_24_基于XML校验的规则、特点
  4. C puzzles详解【38-45题】
  5. ​浅谈Asp.net的sessionState
  6. Window服务初级教程以及log4net配置文件初始化
  7. 开箱即用 - Grunt合并和压缩 js,css 文件
  8. linux 私房菜 CH5 笔记
  9. MySQL 查询最近几天的记录 最近7天的记录 本周内的记录
  10. ES7的新特性
  11. mex
  12. Win7 VS2013环境使用cuda_7.5.18
  13. SQL Server 2008中SQL之WaitFor
  14. linux进程管理(四)
  15. 使用IntelliJ IDEA配置Erlang开发环境
  16. Servlet和Android网络交互基础(3)
  17. Win SDK 标准程序
  18. 100078D Domestic Networks
  19. location.href用法总结
  20. Apache Hadoop 3.0.0 Release Notes

热门文章

  1. GS2107-WTBD 用什么软件为什么新建不了GS系列
  2. PROFIBUS,PROFINET,Ethernet三者的区别
  3. Maven 配置文件如何读取pom.xml的内容
  4. [BJDCTF2020]Mark loves cat-1|源代码泄露|变量覆盖
  5. 我用Axure制作了一款火影小游戏 | PM老猫
  6. ABC206 F - Interval Game 2 (区间DP,博弈论,SG函数)
  7. 使用Python批量爬取美女图片
  8. C#基础_C#判断文件是否被打开
  9. 二极管1N4148和1N4007的区别
  10. [Python]-pandas模块-机器学习Python入门《Python机器学习手册》-03-数据整理