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

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.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

开源不易,多多支持~

以上是关于.NET Core C#系列之XiaoFeng.Threading.JobScheduler作业调度的主要内容,如果未能解决你的问题,请参考以下文章

.NET Core加解密实战系列之——RSA非对称加密算法

.net core系列之《.net core中使用MySql以及Dapper》

C#(.Net Core WebAPI)之API文档的生成(Swagger)

C#教程之如何在centos操作系统上发布.net core的项目

SignalR全套系列之在.Net Core 中实现长轮询

asp.net core 系列之静态文件