.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 =>{/*到時間執行任務*/}};

推薦閱讀