前言
NETCore 里說到任務調度,大家首先想到的應該是大名鼎鼎的 QuartzNET 與 Hangfire,然而本篇介紹的卻都不是,而是 Bootstrap Admin(以下簡稱 BA)通用后台權限管理框架中內置的一個小功能任務調度模塊。
為什么重復造輪子
我個人認為這不是重復造輪子,只有自己寫過調度才能對 調度 有深刻的體會,能對很多平時未涉及的知識進行鞏固與學習,通過 Tasks 模塊的編寫對多線程、異步等知識點都能更深入的了解與實踐。
Task 組件介紹
組件同時支持 .net framework 4.5+ 以及 .net standard 2.0 netcoreapp 3.0 netcoreapp 3.1
用法介紹
NETCore 容器注入
public void ConfigureServices(IServiceCollection services)
{
services.AddTaskServices();
}
NETFramework 4.5+
// 程序入口調用
TaskServicesManager.Init();
例子
默認任務 (立即執行,僅執行一次)
TaskServicesManager.GetOrAdd("簡單任務1", token => Console.WriteLine("Hello world"));
TaskServicesManager.GetOrAdd("簡單任務2", token => Console.WriteLine("Hello world"), TriggerBuilder.Default.Build());
周期性任務 (1 分鍾后間隔 5 秒執行2次任務)
// 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 表達式是用於定義固定時間、日期和間隔的掩碼。掩碼由秒(可選)、分鍾、小時、日、月和星期字段組成。所有字段都允許指定多個值,如果所有字段都包含匹配的值,則任何給定的日期/時間都將滿足指定的 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 簡單太多太多了,再來個稍微復雜一點點的。
/// <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 進行的消息推送 鏈接地址
碼雲項目地址: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]: 精簡版任務調度模塊