.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 =>{/*到时间执行任务*/}};

推荐阅读