原文連結:https://www.cnblogs.com/ysmc/p/16512309.html
在上兩篇文章中,簡單介紹了怎麼使用 IHostedService 與 BackgroundService 實現定時任務,除此以外,我們還可以藉助一些第三方的元件實現定時任務,如大家比較熟悉的 Quartz,今天給大家介紹另外一個輕量級的定時任務元件 Longbow.Tasks,Longbow.Tasks 同樣是也是繼承了 IHostedService 噢,支援cron,該元件在 Gitee 上開源,感興趣的小夥伴可以去看看,傳送門;
值得一提的是,該元件同時支援 .NET Framework 與 .Net Core,下面看看官方說明:
任務服務管理是 BootstrapAdmin 內建的輕量級多執行緒安全的定時後臺任務模組,功能均內建於 Longbow.Tasks.dll 元件庫內,支援 NETFramework 4.5+ 與 NETCore 2.0+
public void ConfigureServices(IServiceCollection services) { services.AddTaskServices(); }
// 程式入口呼叫 TaskServicesManager.Init();
後臺任務服務工廠介面,內部實現類為 TaskServicesFactory 也繼承了 IHostedService 所以元件通過 services.AddTaskServices();
將任務服務注入到 NETCore 容器中
後臺任務排程介面,內部實現類為 DefaultScheduler 負責管理任務的排程
後臺任務觸發器介面,內部內建三個實現類分別為 (預設觸發器僅觸發一次)DefaultTrigger (週期性定時觸發器)RecurringTrigger (Cron表示式觸發器)CronTrigger 可以通過實現 ITrigger 介面根據實際業務需要自行擴充套件觸發器,元件預設提供 TriggerBuilder 負責建立任務觸發器
後臺任務業務類介面,僅一個 Task Execute(CancellationToken cancellationToken);
方法,後臺任務具體實現
後臺任務服務設定類
後臺任務服務人機互動操作類,提供所有後臺任務操作相關 API
首先我們需要安裝這個元件包,搜尋 Longbow.Tasks 並安裝
註冊該元件服務,然後就可以愉快的使用了;
builder.Services.AddTaskServices();
1、建立一個類,並且繼承 ITask,實現介面,寫上需要執行的任務程式碼:
public class TasksDemo : ITask { public Task Execute(CancellationToken cancellationToken) { Console.WriteLine($"{DateTime.Now}"); return Task.CompletedTask; } }
2、在你需要啟動定時任務的地方,加上以下程式碼,按照自己的需要選擇中意的任務執行方式唄
1 //立即執行,僅執行一次 2 TaskServicesManager.GetOrAdd<TasksDemo>("任務唯一標識"); 3 4 //週期性任務 (1 分鐘後間隔 5 秒執行2次任務) 5 var trigger = TriggerBuilder.Default.WithInterval(TimeSpan.FromSeconds(5)).WithRepeatCount(2).WithStartTime(DateTimeOffset.Now.AddMinutes(1)).Build(); 6 7 TaskServicesManager.GetOrAdd<TasksDemo>("任務唯一標識", trigger); 8 9 //支援cron表示式,間隔 5 秒迴圈執行任務 10 TaskServicesManager.GetOrAdd<TasksDemo>("任務唯一標識", TriggerBuilder.Build("*/5 * * * * *"));
值得一提的是,這裡的 Cron 表示式並不支援年,下面我們看看 Longbow.Tasks 的官方說明:
cron 表示式是用於定義固定時間、日期和間隔的掩碼。掩碼由秒(可選)、分鐘、小時、日、月和星期欄位組成。所有欄位都允許指定多個值,如果所有欄位都包含匹配的值,則任何給定的日期/時間都將滿足指定的 cron 表示式。
Allowed values Allowed special characters Comment
┌───────────── second (optional) 0-59 * , - /
│ ┌───────────── minute 0-59 * , - /
│ │ ┌───────────── hour 0-23 * , - /
│ │ │ ┌───────────── day of month 1-31 * , - / L W ?
│ │ │ │ ┌───────────── month 1-12 or JAN-DEC * , - /
│ │ │ │ │ ┌───────────── day of week 0-6 or SUN-SAT * , - / # L ? Both 0 and 7 means SUN
│ │ │ │ │ │
* * * * * *
有小夥伴可能要問了,那我怎麼停止定時任務的執行呢,在我們啟動任務的時候,是需要輸入一個任務的唯一標識的,我們可以通過這個標識,找到我們任務的執行器,並對其進行啟動、暫停、停止等操作:
var task = TaskServicesManager.Get("任務唯一標識");
獲取範例後,我們來看看都提供了一些什麼樣的操作吧
1 public interface IScheduler 2 { 3 /// <summary> 4 /// 獲得 任務排程名稱 5 /// </summary> 6 string Name { get; } 7 8 /// <summary> 9 /// 獲得/設定 排程器狀態 10 /// </summary> 11 SchedulerStatus Status { get; set; } 12 13 /// <summary> 14 /// 獲得 下一次執行時間 為空時表示不再執行 15 /// </summary> 16 DateTimeOffset? NextRuntime { get; } 17 18 /// <summary> 19 /// 獲得 上一次執行時間 為空時表示未執行 20 /// </summary> 21 DateTimeOffset? LastRuntime { get; } 22 23 /// <summary> 24 /// 獲得 上一次任務執行結果 25 /// </summary> 26 TriggerResult LastRunResult { get; } 27 28 /// <summary> 29 /// 獲得 上一次執行異常 30 /// </summary> 31 Exception? Exception { get; } 32 33 /// <summary> 34 /// 獲得 排程器建立時間 35 /// </summary> 36 DateTimeOffset CreatedTime { get; } 37 38 /// <summary> 39 /// 獲得 排程器相關觸發器 40 /// </summary> 41 IEnumerable<ITrigger> Triggers { get; } 42 43 /// <summary> 44 /// 獲得 排程器相關聯任務 45 /// </summary> 46 ITask? Task { get; } 47 }
好了,這次的介紹就到這,下一篇將會使用 Longbow.Tasks 進行實戰介紹【手動狗頭】
Bootstrap Blazor 官網地址:https://www.blazor.zone
希望大佬們看到這篇文章,能給專案點個star支援下,感謝各位!
star流程:
1、存取點選專案連結:BootstrapBlazor
另外還有兩個GVP專案,大佬們方便的話也點下star唄,非常感謝:
BootstrapAdmin 專案地址: