作业调度其实就是一个定时器,定时完成某件事,
比如:每分钟执行一次,每小时执行一次,每天执行一次,第二周几执行,每月几号几点执行,间隔多少个小时执行一次等。
作业类: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
开源不易,多多支持~
文章来源: 博客园
- 还没有人评论,欢迎说说您的想法!