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


    🚀 优质资源分享 🚀

    学习路线指引(点击解锁)知识定位人群定位
    🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
    💛Python量化交易实战💛入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

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

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

    作业类: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 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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132

    接下来每种类型写一下实例

    1.定时只执行一次也就是多久后执行

    var job = new XiaoFeng.Threading.Job
    {
     Async = true,
     Name="作业名称",
     TimerType= XiaoFeng.Threading.TimerType.Once,
     StartTime= DateTime.Now.AddMinutes(5),
     SuccessCallBack = job =>
     {
     /*到时间执行任务*/
     }
    };
    job.Start();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    当前作业为5 分钟后执行一次,然后就是销毁,作业从调度中移除。

    也可以用任务去实现当前功能如下代码:

    Task.Factory.StartNew(() =>
    {
     /*等待5分钟*/
     Task.Delay(5 * 60 * 1000).Wait();
     /*执行作业任务*/
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    当前作业为,5分钟后运行,然后每隔5分钟会再执行一次间隔执行就是每隔一段时间去执行一次任务,也可以用任务去实现当前功能,如下:

    var cancelToken = new CancellationTokenSource();
    Task.Factory.StartNew(() =>
    {
     while (!cancelToken.IsCancellationRequested)
     {
     /*等待5分钟*/
     Task.Delay(5 * 60 * 1000).Wait();
     /*执行作业任务*/
     }
    },TaskCreationOptions.LongRunning);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    上边代码同样实现了每间隔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 =>
     {
     /*到时间执行任务*/
     }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    当前作业为,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();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    当前作业为,5分钟后运行,然后每周的周一,四的2点执行一 次。

    以上就是作业调度的简单使用。

    开源地址:https://github.com/zhuovi/XiaoFeng/tree/master/Threading

    语雀地址:https://www.yuque.com/fayelf/xiaofeng/yl8tkh

    开源不易,多多支持~

  • 相关阅读:
    树莓派4 AV没有视频输出
    2、搭建MyBatis
    【C语言刷LeetCode】395. 至少有 K 个重复字符的最长子串(M)
    字符串——OKR-Periods of Words(kmp求最短相同前后缀或者说求最长循环节)
    数字孪生云渲染整体架构设计
    day06_面向对象基础
    人工智能 | ShowMeAI资讯日报 #2022.06.24
    HarmonyOS 性能优化
    骑行听音乐用什么耳机,盘点几款适合在出行佩戴的耳机
    Redis 入门和数据类型讲解
  • 原文地址:https://blog.csdn.net/qq_43479892/article/details/127438130