.NET Core C#系列之XiaoFeng.Threading.JobScheduler作業排程

2022-10-20 21:00:31

作業排程其實就是一個定時器,定時完成某件事,

比如:每分鐘執行一次,每小時執行一次,每天執行一次,第二週幾執行,每月幾號幾點執行,間隔多少個小時執行一次等。

作業類: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

開源不易,多多支援~