作業排程其實就是一個定時器,定時完成某件事,
比如:每分鐘執行一次,每小時執行一次,每天執行一次,第二週幾執行,每月幾號幾點執行,間隔多少個小時執行一次等。
作業類: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
開源不易,多多支援~