• .NET Core C#系列之XiaoFeng.Threading.JobScheduler作业调度


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

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

    作业类:XiaoFeng.Threading.Job

    主调度类:XiaoFeng.Threading.JobScheduler

    先介绍一下 IJob接口

    复制代码
    /// 
    /// 作业接口
    /// 
    public interface IJob
    {
        #region 属性
        /// 
        /// 当前调度
        /// 
        IJobScheduler Scheduler { get; set; }
        /// 
        /// 运行状态
        /// 
        JobStatus Status { get; set; }
        /// 
        /// 作业数据
        /// 
        object State { get; set; }
        /// 
        /// 是否是异步
        /// 
        bool Async { get; set; }
        /// 
        /// 已成功运行次数
        /// 
        int SuccessCount { get; set;  }
        /// 
        /// 失败运行次数
        /// 
        int FailureCount { get; set; }
        /// 
        /// 运行日志
        /// 
        List<string> Message { get; set; }
        /// 
        /// 取消信号
        /// 
        CancellationTokenSource CancelToken { get; set; }
        /// 
        /// 作业ID
        /// 
        Guid ID { get; }
        /// 
        /// 作业名称
        /// 
        string Name { get; set; }
        /// 
        /// 运行次数
        /// 
        int Count { get; }
        /// 
        /// 成功回调
        /// 
        Action SuccessCallBack { get; set; }
        /// 
        /// 当前任务执行完成后再进入计时队列 此方法最后一定要设置job的状态等待
        /// 
        Action CompleteCallBack { get; set; }
        /// 
        /// 失败回调
        /// 
        Action FailureCallBack { get; set; }
        /// 
        /// 停止作业回调
        /// 
        Action StopCallBack { get; set; }
        /// 
        /// 最后一次运行时间
        /// 
        DateTime? LastTime { get; set; }
        /// 
        /// 下次运行时间
        /// 
        DateTime? NextTime { get; set; }
        /// 
        /// 启动时间
        /// 
        DateTime? StartTime { get; set; }
        /// 
        /// 最大运行次数
        /// 
        int? MaxCount { get; set; }
        /// 
        /// 过期时间
        /// 
        DateTime? ExpireTime { get; set; }
        /// 
        /// 运行完是否销毁
        /// 
        bool IsDestroy { get; set; }
        /// 
        /// 定时器类型
        /// 
        TimerType TimerType { get; set; }
        /// 
        /// 时间
        /// 
        Time Time { get; set; }
        /// 
        /// 间隔 单位毫秒
        /// 
        int Period { get; set; }
        /// 
        /// 几点,几号,周几(周日为一周的第一天),可用负数,-1代表一天中最后一小时即23点,一周内最后一天即周六,一月内最后一天
        /// 
        int[] DayOrWeekOrHour { get; set; }
        #endregion
    
        #region 启动作业
        /// 
        /// 启动作业
        /// 
        void Start();
        /// 
        /// 启动作业
        /// 
        /// 调度
        void Start(IJobScheduler scheduler);
        #endregion
    
        #region 停止作业
        /// 
        /// 停止作业
        /// 
        void Stop();
        /// 
        /// 停止作业
        /// 
        /// 调度
        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

    开源不易,多多支持~

     

  • 相关阅读:
    王道数据结构——顺序循环队列
    如何写成高性能的代码(一):巧用Canvas绘制电子表格
    多模态领域的先进模型
    Greenplum数据库故障分析——能对数据库base文件夹进行软连接嘛?
    数据结构-链式二叉树
    docker安装ELK详细步骤(冒着被老板开的风险,生产试验,适用所有版本)
    赶紧看!阿里架构师必备“绝杀版”Tomact 架构笔记堪称绝技
    论文写作笔记
    活动选择问题
    努力前行,平凡的我们也能画出一条星光闪耀的轨迹——人大女王金融硕士项目
  • 原文地址:https://www.cnblogs.com/zhaocici/p/16811087.html