NETCore 裏說到任務調度,你們首先想到的應該是大名鼎鼎的 QuartzNET 與 Hangfire,然而本篇介紹的卻都不是,而是 Bootstrap Admin(如下簡稱 BA)通用後臺權限管理框架中內置的一個小功能任務調度模塊。html
我我的認爲這不是重複造輪子,只有本身寫過調度才能對 調度 有深入的體會,能對不少平時未涉及的知識進行鞏固與學習,經過 Tasks 模塊的編寫對多線程、異步等知識點都能更深刻的瞭解與實踐。git
組件同時支持 .net framework 4.5+ 以及 .net standard 2.0 netcoreapp 3.0 netcoreapp 3.1c#
public void ConfigureServices(IServiceCollection services) { services.AddTaskServices(); }
// 程序入口調用 TaskServicesManager.Init();
TaskServicesManager.GetOrAdd("簡單任務1", token => Console.WriteLine("Hello world")); TaskServicesManager.GetOrAdd("簡單任務2", token => Console.WriteLine("Hello world"), TriggerBuilder.Default.Build());
// 1 分鐘後間隔 5 秒執行2次任務 var trigger = TriggerBuilder.Default.WithInterval(TimeSpan.FromSeconds(5)).WithRepeatCount(2).WithStartTime(DateTimeOffset.Now.AddMinutes(1)).Build(); TaskServicesManager.GetOrAdd("週期任務", token => Console.WriteLine("Hello world"), trigger);
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 │ │ │ │ │ │ * * * * * *
// 每秒鐘執行一次任務 TaskServicesManager.GetOrAdd("表達式任務", token => Console.WriteLine("Hello world"), TriggerBuilder.Build(Cron.Secondly())); // 每分鐘執行一次任務 TaskServicesManager.GetOrAdd("表達式任務", token => Console.WriteLine("Hello world"), TriggerBuilder.Build(Cron.Minutely())); // 間隔 5 秒循環執行任務 TaskServicesManager.GetOrAdd("表達式任務", token => Console.WriteLine("Hello world"), TriggerBuilder.Build("*/5 * * * * *")); // 每分鐘的第 5 秒循環執行任務 TaskServicesManager.GetOrAdd("表達式任務", token => Console.WriteLine("Hello world"), TriggerBuilder.Build("5 * * * * *"));
經過上面的簡單介紹能夠看出來這個 Task 組件要比 QuartzNET 與 Hangfire 簡單太多太多了,再來個稍微複雜一點點的。app
/// <summary> /// 後臺任務實現類 /// </summary> public class FooTask : ITask { /// <summary> /// 後臺任務具體業務操做 /// </summary> public async Task Execute(CancellationToken cancellationToken) { // 模擬任務執行耗時500毫秒 try { await Task.Delay(500, cancellationToken); } catch (TaskCanceledException) { } if (cancellationToken.IsCancellationRequested) { return; } // do something ... } }
調用代碼框架
// 能夠根據本身的實際須要,更改 Trigger 實例 TaskServicesManager.GetOrAdd<FooTask>();
是否是任務調度很是簡單?代碼量不多不多?異步
上圖爲 Bootstrap Admin 後臺管理平臺內的任務管理實時輸出頁面,每間隔 5 秒鐘,屏幕更新一條記錄,底層使用 signalR 進行的消息推送 連接地址async
碼雲項目地址:https://gitee.com/LongbowEnterprise/BootstrapAdmin
演示網站地址:https://ba.sdgxgz.com
任務管理地址:https://ba.sdgxgz.com/Admin/Tasks學習
NETCore Bootstrap Admin 通用後臺管理權限 [1]: 先後臺分離權限管理系統介紹
NETCore Bootstrap Admin 通用後臺管理權限 [2]: Blazor 版本介紹
NETCore Bootstrap Admin 通用後臺管理權限 [3]: 精簡版任務調度模塊網站