.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

开源不易,多多支持~

 

发表评论

评论已关闭。

相关文章