C#/.NET/.NET Core應(yīng)用程序編程中實(shí)現(xiàn)定時(shí)任務(wù)調(diào)度的方法或者組件有哪些,Timer,FluentScheduler,TaskScheduler,Gofer.NET,Coravel,...

原文由Rector首發(fā)于 碼友網(wǎng)《C#/.NET/.NET Core應(yīng)用程序編程中實(shí)現(xiàn)定時(shí)任務(wù)調(diào)度的方法或者組件有哪些,Timer,FluentScheduler,TaskScheduler,Gofer.NET,Coravel,Quartz.NET還是Hangfire》

摘要

C#/.NET/.NET Core的定時(shí)任務(wù)調(diào)度組件你用過(guò)那些呢,是Timer,FluentScheduler,TaskScheduler,Gofer.NET,Coravel,Quartz.NET還是Hangfire,又或者是其他的定時(shí)任務(wù)調(diào)度框架/組件呢?你常用的實(shí)現(xiàn)定時(shí)任務(wù)調(diào)度的方法又是怎樣的呢?

前言

定時(shí)任務(wù),任務(wù)調(diào)度這些詞在程序開發(fā)中會(huì)被經(jīng)常提及。定時(shí)任務(wù)是什么?在計(jì)算機(jī)的世界里,定時(shí)任務(wù)就是在指定的時(shí)間或者時(shí)間范圍內(nèi),按照一定的頻率完成指定的指令。它是一個(gè)具有周期性,規(guī)律性的活動(dòng)。

定時(shí)任務(wù)可以是:早上按時(shí)叫你起床的鬧鐘,記錄并提醒你日程的日歷或者生日問(wèn)候,某網(wǎng)站定時(shí)給你的周刊、月刊消息推送,某系統(tǒng)周期性做的每日、月度、年度數(shù)據(jù)匯總,等等。

由此可見,定時(shí)任務(wù)與我們的生活、工作緊密聯(lián)系在一起。特別地,對(duì)于我們開發(fā)人員來(lái)說(shuō),但凡要實(shí)現(xiàn)周期性地操作,就需要使用定時(shí)任務(wù)來(lái)處理。

那么,對(duì)于C#/.NET開發(fā)人員來(lái)說(shuō),如何實(shí)現(xiàn)定時(shí)任務(wù),實(shí)現(xiàn)定時(shí)任務(wù)又有哪些方法或者有哪些組件呢?這些問(wèn)題對(duì)于從事C#/.NET的開發(fā)者,特別是剛?cè)胄胁痪没蛘呓?jīng)驗(yàn)欠缺者來(lái)說(shuō)將會(huì)是比較困擾的問(wèn)題。

今天Rector就收集整理一些C#/.NET/.NET Core應(yīng)用程序編程開發(fā)中常用的實(shí)現(xiàn)定時(shí)任務(wù)調(diào)度的方法或者定時(shí)任務(wù)調(diào)度組件。

Timer類

Timer是.NET內(nèi)置的定時(shí)器類,它位于命名空間System.Timers下。Timer是一個(gè)基于服務(wù)器端的計(jì)時(shí)器,提供了Interval屬性來(lái)設(shè)置重復(fù)觸發(fā)定時(shí)任務(wù)的間隔(單位為毫秒),觸發(fā)事件則由Elapsed事件來(lái)指定。另外,還可以通過(guò)AutoReset屬性來(lái)設(shè)置Timer的Elapsed事件只觸發(fā)一次或者重復(fù)觸發(fā)。

官方地址: https://docs.microsoft.com/en-us/dotnet/api/system.timers.timer?view=netframework-4.8

特性

  • 輕量,簡(jiǎn)單易用
  • .NET框架內(nèi)置,無(wú)須引用第三方庫(kù)
  • 不支持Cron表達(dá)式

FluentScheduler

FluentScheduler是由一位巴西的.NET開發(fā)者Talles L開發(fā)并維護(hù)的.NET平臺(tái)下的一款自動(dòng)定時(shí)任務(wù)調(diào)度器組件,它提供了比較豐富的定時(shí)任務(wù)調(diào)度接口,開發(fā)者可以快速方便地通過(guò)接口設(shè)置調(diào)度時(shí)間,比如:間隔1秒,2秒...n秒,只執(zhí)行一次,哪月的哪一天等等。具體請(qǐng)參考我之前寫過(guò)的兩篇關(guān)于FluentScheduler的文章:

官方地址: https://github.com/fluentscheduler/FluentScheduler

特性

  • 提供豐富的任務(wù)調(diào)度接口,配置方便

TaskScheduler

TaskScheduler是一個(gè)為Windows任務(wù)調(diào)度程序提供.NET的封裝組件,可以代替Windows操作系統(tǒng)自帶的定時(shí)任務(wù)使用,提供了代碼和編輯器兩種方式創(chuàng)建定時(shí)任務(wù)。它聚合了多個(gè)版本,并提供編輯調(diào)度編輯器以快速創(chuàng)建定時(shí)任務(wù)。

官方地址: https://github.com/dahall/TaskScheduler

特性

  • 支持.NET的多個(gè)版本(.NET 2.0, 3.5, 4.0, 4.52 and .NET Standard 2.0.)
  • 支持包括腳本語(yǔ)言在內(nèi)的所有.NET語(yǔ)言,比如(PowerShell)
  • 支持所有的V2本地化屬性,甚至在V1的系統(tǒng)中
  • 支持序列化成XML
  • 支持目標(biāo)版本的任務(wù)驗(yàn)證
  • 支持Cron表達(dá)式觸發(fā)器
  • 提供可視化的定時(shí)任務(wù)調(diào)度編輯器
  • 提供動(dòng)作編輯器,觸發(fā)器編輯器,事件查看器,任務(wù)執(zhí)行歷史查看器等對(duì)話框

Gofer.NET

Gofer.NET是支持分布式的任務(wù)/作業(yè)調(diào)度組件,可以運(yùn)行在.NET Core應(yīng)用程序中。

官方地址: https://github.com/brthor/Gofer.NET

特性

  • 使用通用表達(dá)式語(yǔ)法將作業(yè)添加到隊(duì)列并執(zhí)行
  • 可簡(jiǎn)單地通過(guò)添加新節(jié)點(diǎn)來(lái)擴(kuò)展任務(wù)工作池
  • 在Redis的支持下,所有的任務(wù)都被持久化

Coravel

Coravel是一個(gè)零配置的基于.NET標(biāo)準(zhǔn)庫(kù)的微組件,它包含了定時(shí)任務(wù)調(diào)度,緩存,隊(duì)列,事件廣播等等功能。

官方地址: https://docs.coravel.net/Scheduler/

  • 簡(jiǎn)單,優(yōu)雅,流暢的代碼書寫方式創(chuàng)建定時(shí)任務(wù)
  • 基于.NET標(biāo)準(zhǔn)庫(kù),跨平臺(tái)
  • 豐富的調(diào)度接口
  • 支持Cron表達(dá)式
  • 支持全局錯(cuò)誤處理

Quartz.NET

Quartz.NET是一個(gè)開源的定時(shí)作業(yè)調(diào)度項(xiàng)目,旨在創(chuàng)建一個(gè)免費(fèi)商業(yè)使用的作業(yè)調(diào)度器,同時(shí)具有“企業(yè)級(jí)”的特性。Quartz.NET目前的版本是支持跨平臺(tái)的,即支持.NET和.NET Core的應(yīng)用程序。

官方地址: http://www.quartz-scheduler.net/

特性

  • API 操作簡(jiǎn)單,只要幾行簡(jiǎn)單的代碼你就可以在應(yīng)用程序里面實(shí)現(xiàn)自己的作業(yè)調(diào)度,并實(shí)時(shí)監(jiān)視作業(yè)執(zhí)行情況
  • 觸發(fā)器功能強(qiáng)大,比 Windows 的任務(wù)計(jì)劃提供更細(xì)的觸發(fā)粒度
  • 良好的可擴(kuò)展性,它基于接口編程,你可以實(shí)現(xiàn)自己的 Schedule 調(diào)度器,Job 作業(yè),以及 Trigger 觸發(fā)器等
  • 持久化,作業(yè)可以保存在內(nèi)存中,也可以持久化到數(shù)據(jù)庫(kù),支持多種數(shù)據(jù)庫(kù)類型:SqlServer、Oracle、MySql等
  • 分布式和集群,這是一個(gè)高級(jí)應(yīng)用,可以在多臺(tái)計(jì)算機(jī)之間創(chuàng)建負(fù)載平衡、容錯(cuò)處理
  • 支持Cron表達(dá)式
  • 支持以配置文件的方式定制作業(yè)調(diào)度

具體使用可參考《基于ASP.NET MVC(C#)和Quartz.Net組件實(shí)現(xiàn)的定時(shí)執(zhí)行任務(wù)調(diào)度》

Hangfire

Hangfire是一個(gè)支持.NET和.NET Core應(yīng)用程序的跨平臺(tái)的后臺(tái)作業(yè)處理框架,使用Hangfire時(shí)不再需要Windows服務(wù)或者單獨(dú)的進(jìn)程。Hangfire可以在ASP.NET/ASP.NET Core等應(yīng)用程序中以簡(jiǎn)單的方式實(shí)現(xiàn)觸發(fā),延遲以及定時(shí)執(zhí)行等任務(wù)。同時(shí)還支持CPU和I/O密集型、長(zhǎng)時(shí)間運(yùn)行和短時(shí)間運(yùn)行的作業(yè)而不需要設(shè)置Windows服務(wù)或者其他的任務(wù)調(diào)度。Hangfire支持多種數(shù)據(jù)存儲(chǔ)方式,如:Redis, SQL Server, SQL Azure和MSMQ等。

官方地址: https://www.hangfire.io

特性

  • 安裝簡(jiǎn)單,快速入門:沒(méi)有Windows服務(wù),沒(méi)有Windows調(diào)度程序,不需要單獨(dú)的應(yīng)用程序
  • 可持久化:后臺(tái)作業(yè)是在存儲(chǔ)中持久存儲(chǔ)介質(zhì)中的,如:SQL Server、Redis、PostgreSQL、MongoDB等
  • 作業(yè)數(shù)據(jù)透明:內(nèi)置的web界面允許您查看后臺(tái)作業(yè)的整體情況,以及觀察每個(gè)后臺(tái)作業(yè)的狀態(tài)
  • 可靠:后臺(tái)作業(yè)一旦無(wú)異常地被創(chuàng)建,Hangfire負(fù)責(zé)至少處理一次這個(gè)作業(yè)
  • 分布式:后臺(tái)方法調(diào)用及其參數(shù)是序列化的,因此可以克服進(jìn)程邊界問(wèn)題
  • 可擴(kuò)展:作業(yè)過(guò)濾器允許您以類似于ASP.NET MVC操作過(guò)濾器的方式向后臺(tái)處理添加自定義功能
  • 高效:盡管默認(rèn)安裝使用SQL Server和輪詢來(lái)獲取作業(yè),但可以利用MSMQ或Redis擴(kuò)展來(lái)將處理延遲降低到最低
  • 自維護(hù):你不需要手動(dòng)維護(hù)和清理存儲(chǔ)空間,Hangfire會(huì)盡可能地自動(dòng)清理舊的數(shù)據(jù)
  • 開源免費(fèi):Hangfire是開源的框架并且對(duì)商用免費(fèi),只需遵循LGPLv3許可即可

結(jié)束語(yǔ)

本文旨在為大家收集整理.NET/.NET Core中常用的定時(shí)任務(wù)框架和組件,希望對(duì)你有幫助。

如果你還有其他的或者更好的框架/組件,歡迎留言反饋。

碼友網(wǎng):一個(gè)專注.NET/.NET Core開發(fā)的編程愛(ài)好者社區(qū)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容