.NET Core 實現後台任務(定時任務)Longbow.Tasks 組件(三)
- 2022 年 7 月 23 日
- 筆記
- .NET Core, c#, IHostedService
原文鏈接://www.cnblogs.com/ysmc/p/16512309.html
在上兩篇文章中,簡單介紹了怎麼使用 IHostedService 與 BackgroundService 實現定時任務,除此以外,我們還可以藉助一些第三方的組件實現定時任務,如大家比較熟悉的 Quartz,今天給大家介紹另外一個輕量級的定時任務組件 Longbow.Tasks,Longbow.Tasks 同樣是也是繼承了 IHostedService 噢,支援cron,該組件在 Gitee 上開源,感興趣的小夥伴可以去看看,傳送門;
值得一提的是,該組件同時支援 .NET Framework 與 .Net Core,下面看看官方說明:
Task 任務管理
任務服務管理是 BootstrapAdmin 內置的輕量級多執行緒安全的定時後台任務模組,功能均內置於 Longbow.Tasks.dll 組件庫內,支援 NETFramework 4.5+ 與 NETCore 2.0+
設置
NETCore 容器注入
public void ConfigureServices(IServiceCollection services) { services.AddTaskServices(); }
NETFramework 4.5+
// 程式入口調用 TaskServicesManager.Init();
組成
ITaskServicesFactory
後台任務服務工廠介面,內部實現類為 TaskServicesFactory 也繼承了 IHostedService 所以組件通過 services.AddTaskServices();
將任務服務注入到 NETCore 容器中
IScheduler
後台任務調度介面,內部實現類為 DefaultScheduler 負責管理任務的調度
ITrigger
後台任務觸發器介面,內部內置三個實現類分別為 (默認觸發器僅觸發一次)DefaultTrigger (周期性定時觸發器)RecurringTrigger (Cron表達式觸發器)CronTrigger 可以通過實現 ITrigger 介面根據實際業務需要自行擴展觸發器,組件默認提供 TriggerBuilder 負責創建任務觸發器
ITask
後台任務業務類介面,僅一個 Task Execute(CancellationToken cancellationToken);
方法,後台任務具體實現
TaskServicesOptions
後台任務服務配置類
TaskServicesManager:
後台任務服務人機交互操作類,提供所有後台任務操作相關 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 表達式是用於定義固定時間、日期和間隔的掩碼。掩碼由秒(可選)、分鐘、小時、日、月和星期欄位組成。所有欄位都允許指定多個值,如果所有欄位都包含匹配的值,則任何給定的日期/時間都將滿足指定的 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 官網地址://www.blazor.zone
希望大佬們看到這篇文章,能給項目點個star支援下,感謝各位!
star流程:
1、訪問點擊項目鏈接:BootstrapBlazor
2、點擊star,如下圖,即可完成star,關注項目不迷路:
另外還有兩個GVP項目,大佬們方便的話也點下star唄,非常感謝:
BootstrapAdmin 項目地址:
//gitee.com/LongbowEnterprise/BootstrapAdmin
SliderCaptcha 項目地址:
//gitee.com/LongbowEnterprise/SliderCaptcha
交流群(QQ)歡迎加群討論
BA & Blazor ①(795206915) BA & Blazor ②(675147445)