如果用知乎,可以關注專欄:.NET開源項目和PowerBI社區
Quartznet大名鼎鼎應該很少有人不知道,相關的開源項目很多,不過那東東對新手來說,有點晦澀,加上哪個Cron表達式,可能一進去雲里霧里的。今天給大家介紹一個簡單的在.NET平台上運行Cron計划任務的組件CronNET。同時也給大家推介幾個Cron表達式的工具。
本文原文地址:.NET平台開源項目速覽(21)Cron任務調度CronNET
1.Cron介紹和工具
cron是一個linux下的定時執行工具,可以在無需人工干預的情況下運行作業。cron服務器可以根據配置文件約定的時間來執行特定的作務。所以其他組件和平台根據其語法做了支持,就有了各種各樣的語言版本。Cron的語法表達式非常靈活,也非常復雜,不過不建議大家一次性擼進去出不來,需要用到的時候用下面幾個工具查一下,生成就好。慢慢就理解了,當然簡單主要的語法看得懂就行,抄來抄去就會了。
如果要了解Cron語法,可以看下面這篇文章,非常簡潔和全面:Cron表達式。
下面給大家介紹2個好用的Cron工具:
1.在線Cron表達式生成器:http://cron.qqe2.com/ 。配置相當全面,可以把你想要執行的任務直接圖形化界面配置出來,得到Cron表達式。也可以反解析到UI,如下圖:

2.Cron表達式解析組件:https://github.com/bradymholt/cron-expression-descriptor,可以將Cron表達的轉換為自然語言,支持很多語言,包括中文。重點包括了中文
看看第3部分我們的演示。
2.CronNET介紹和使用
CronNET是一個簡單的C#類庫,用來執行Cron表達式定義的計划任務。它支持絕大部分Cron表達式,看測試下面的代碼,非常全面了。而且整個下面短小精悍,總過不過110行代碼。所以集成到自己的項目中去也非常容易。
Github地址:https://github.com/kevincolyar/CronNET
下面我們通過一段簡單的代碼來看看效果和使用。自己下面源代碼編譯dll,引用命名空間 using CronNET
2.1 基本使用
定義一個全局的CronDaemon對象,用來存儲Job,在main函數中添加cron任務,我添加了一個每分鍾執行的任務,任務的內容就是打印個日志。
private static CronDaemon cron_daemon = new CronDaemon();
static void Main(string[] args)
{
cron_daemon.AddJob("* * * * *", MiniteTask);
Console.WriteLine("任務開始時間:{0}", DateTime.Now.ToLongTimeString());
cron_daemon.Start();
while (true) Thread.Sleep(6000);
}
static void MiniteTask()
{
Console.WriteLine("{0}:定時任務執行",DateTime.Now.ToLongTimeString());
}
看看執行結果,每分鍾都執行了一次:

2.2 Windows服務
下面我們看看在windows服務中怎么使用,起始原理差不多,Github里面有一個windows服務的例子,不過我一般比較喜歡用XAgent來完成。
class MyService : AgentServiceBase<MyService>
{
//Job
private static CronDaemon cron_daemon = new CronDaemon();
internal static void MiniteTask()
{
XTrace.WriteLine("{0}:定時任務執行", DateTime.Now.ToLongTimeString());
}
public MyService()
{
//設置服務名稱和描述,以及線程數
DisplayName = "CronTestService";
Description = "CronTestService";
ThreadCount = 0;
cron_daemon.AddJob("* * * * *", MiniteTask);//添加job
}
/// <summary>服務啟動</summary>
/// </remarks>
protected override void StartWork(String reason)
{
XTrace.WriteLine("任務開始時間:{0}", DateTime.Now.ToLongTimeString());
cron_daemon.Start();//啟動
base.StartWork(reason);
}
/// <summary>服務停止</summary>
protected override void StopWork(String reason)
{
base.StopWork(reason);
}
}
XAgent是一個快速,圖形化界面的Windows服務工具,集成在Newlife組件中。使用可以參考我的這篇博客:探索Newlife組件:服務代理利器XAgent的前世今生。
下面是運行效果,結果,結果在右邊日志文件中。

3.cron-expression-descriptor使用
cron-expression-descriptor是一個C#開發的開源Cron表達式解析器,可以將Cron表達式轉換為自然語言,支持英語/西班牙語/俄語/法語/簡體中文等語言。支持的平台有.NET Core1.0,.NET Framework 4.5和Mono 4.5。
Github地址:https://github.com/bradymholt/cron-expression-descriptor
比如我們來看幾個例子,直接在VS中使用Nuget,搜索CronExpressionDescriptor安裝即可:
static void Main(string[] args)
{
XTrace.UseConsole();
XTrace.WriteLine(ExpressionDescriptor.GetDescription("*/6 * 1 * *",
new Options() { Locale= "zh-CN" }));
XTrace.WriteLine(ExpressionDescriptor.GetDescription("* * * 2,6 *",
new Options() { Locale = "zh-CN" }));
XTrace.WriteLine(ExpressionDescriptor.GetDescription("*/3 12 * 1 MON-FRI",
new Options() { Locale = "zh-CN" }));
Console.ReadKey();
}
解析的內容如下,我們在選項中配置了Local="zh-CN":

注意安裝后,支持的語言資源文件都在bin目錄下,如下面就是支持的語言:

所以有了這東西,做一個在線版的Cron解析器也很easy了。。。好了,剩下的該你在業務中表演了。
4.資源
本文演示代碼下載:CronNET.rar
Cron表達式語法參考:Cron表達式
CronNET Github地址:https://github.com/kevincolyar/CronNET
Cron解析器Github地址:https://github.com/bradymholt/cron-expression-descriptor
