C#/.NET/.NET Core定时任务调度的方法或者组件[转载]
原文由Rector首发于 码友网 之 《C#/.NET/.NET Core应用程序编程中实现定时任务调度的方法或者组件有哪些,Timer,FluentScheduler,TaskScheduler,Gofer.NET,Coravel,Quartz.NET还是Hangfire》
摘要
C#/.NET/.NET Core的定时任务调度组件你用过那些呢,是Timer
,FluentScheduler
,TaskScheduler
,Gofer.NET
,Coravel
,Quartz.NET
还是Hangfire
,又或者是其他的定时任务调度框架/组件呢?你常用的实现定时任务调度的方法又是怎样的呢?
前言
定时任务,任务调度这些词在程序开发中会被经常提及。定时任务是什么?在计算机的世界里,定时任务就是在指定的时间或者时间范围内,按照一定的频率完成指定的指令。它是一个具有周期性,规律性的活动。
定时任务可以是:早上按时叫你起床的闹钟,记录并提醒你日程的日历或者生日问候,某网站定时给你的周刊、月刊消息推送,某系统周期性做的每日、月度、年度数据汇总,等等。
由此可见,定时任务与我们的生活、工作紧密联系在一起。特别地,对于我们开发人员来说,但凡要实现周期性地操作,就需要使用定时任务来处理。
那么,对于C#/.NET开发人员来说,如何实现定时任务,实现定时任务又有哪些方法或者有哪些组件呢?这些问题对于从事C#/.NET的开发者,特别是刚入行不久或者经验欠缺者来说将会是比较困扰的问题。
今天Rector就收集整理一些C#/.NET/.NET Core应用程序编程开发中常用的实现定时任务调度的方法或者定时任务调度组件。
Timer类
Timer是.NET内置的定时器类,它位于命名空间System.Timers
下。Timer是一个基于服务器端的计时器,提供了Interval
属性来设置重复触发定时任务的间隔(单位为毫秒),触发事件则由Elapsed
事件来指定。另外,还可以通过AutoReset
属性来设置Timer的Elapsed
事件只触发一次或者重复触发。
官方地址: https://docs.microsoft.com/en-us/dotnet/api/system.timers.timer?view=netframework-4.8
特性
- 轻量,简单易用
- .NET框架内置,无须引用第三方库
- 不支持Cron表达式
FluentScheduler
FluentScheduler是由一位巴西的.NET开发者Talles L开发并维护的.NET平台下的一款自动定时任务调度器组件,它提供了比较丰富的定时任务调度接口,开发者可以快速方便地通过接口设置调度时间,比如:间隔1秒,2秒...n秒,只执行一次,哪月的哪一天等等。具体请参考我之前写过的两篇关于FluentScheduler的文章:
- 《推荐一个简单、轻量、功能非常强大的C#/ASP.NET定时任务执行管理器组件--FluentScheduler》
- 《简单、轻量、功能非常强大的C#/ASP.NET定时调度任务执行管理组件–FluentScheduler之实例篇》
官方地址: https://github.com/fluentscheduler/FluentScheduler
特性
- 提供丰富的任务调度接口,配置方便
TaskScheduler
TaskScheduler是一个为Windows任务调度程序提供.NET的封装组件,可以代替Windows操作系统自带的定时任务使用,提供了代码和编辑器两种方式创建定时任务。它聚合了多个版本,并提供编辑调度编辑器以快速创建定时任务。
官方地址: https://github.com/dahall/TaskScheduler
特性
- 支持.NET的多个版本(.NET 2.0, 3.5, 4.0, 4.52 and .NET Standard 2.0.)
- 支持包括脚本语言在内的所有.NET语言,比如(PowerShell)
- 支持所有的V2本地化属性,甚至在V1的系统中
- 支持序列化成XML
- 支持目标版本的任务验证
- 支持Cron表达式触发器
- 提供可视化的定时任务调度编辑器
- 提供动作编辑器,触发器编辑器,事件查看器,任务执行历史查看器等对话框
Gofer.NET
Gofer.NET是支持分布式的任务/作业调度组件,可以运行在.NET Core应用程序中。
官方地址: https://github.com/brthor/Gofer.NET
特性
- 使用通用表达式语法将作业添加到队列并执行
- 可简单地通过添加新节点来扩展任务工作池
- 在Redis的支持下,所有的任务都被持久化
Coravel
Coravel是一个零配置的基于.NET标准库的微组件,它包含了定时任务调度,缓存,队列,事件广播等等功能。
官方地址: https://docs.coravel.net/Scheduler/
- 简单,优雅,流畅的代码书写方式创建定时任务
- 基于.NET标准库,跨平台
- 丰富的调度接口
- 支持Cron表达式
- 支持全局错误处理
Quartz.NET
Quartz.NET是一个开源的定时作业调度项目,旨在创建一个免费商业使用的作业调度器,同时具有“企业级”的特性。Quartz.NET目前的版本是支持跨平台的,即支持.NET和.NET Core的应用程序。
官方地址: http://www.quartz-scheduler.net/
特性
- API 操作简单,只要几行简单的代码你就可以在应用程序里面实现自己的作业调度,并实时监视作业执行情况
- 触发器功能强大,比 Windows 的任务计划提供更细的触发粒度
- 良好的可扩展性,它基于接口编程,你可以实现自己的 Schedule 调度器,Job 作业,以及 Trigger 触发器等
- 持久化,作业可以保存在内存中,也可以持久化到数据库,支持多种数据库类型:SqlServer、Oracle、MySql等
- 分布式和集群,这是一个高级应用,可以在多台计算机之间创建负载平衡、容错处理
- 支持Cron表达式
- 支持以配置文件的方式定制作业调度
具体使用可参考《基于ASP.NET MVC(C#)和Quartz.Net组件实现的定时执行任务调度》
Hangfire
Hangfire是一个支持.NET和.NET Core应用程序的跨平台的后台作业处理框架,使用Hangfire时不再需要Windows服务或者单独的进程。Hangfire可以在ASP.NET/ASP.NET Core等应用程序中以简单的方式实现触发,延迟以及定时执行等任务。同时还支持CPU和I/O密集型、长时间运行和短时间运行的作业而不需要设置Windows服务或者其他的任务调度。Hangfire支持多种数据存储方式,如:Redis, SQL Server, SQL Azure和MSMQ等。
官方地址: https://www.hangfire.io
特性
- 安装简单,快速入门:没有Windows服务,没有Windows调度程序,不需要单独的应用程序
- 可持久化:后台作业是在存储中持久存储介质中的,如:SQL Server、Redis、PostgreSQL、MongoDB等
- 作业数据透明:内置的web界面允许您查看后台作业的整体情况,以及观察每个后台作业的状态
- 可靠:后台作业一旦无异常地被创建,Hangfire负责至少处理一次这个作业
- 分布式:后台方法调用及其参数是序列化的,因此可以克服进程边界问题
- 可扩展:作业过滤器允许您以类似于ASP.NET MVC操作过滤器的方式向后台处理添加自定义功能
- 高效:尽管默认安装使用SQL Server和轮询来获取作业,但可以利用MSMQ或Redis扩展来将处理延迟降低到最低
- 自维护:你不需要手动维护和清理存储空间,Hangfire会尽可能地自动清理旧的数据
- 开源免费:Hangfire是开源的框架并且对商用免费,只需遵循LGPLv3许可即可
结束语
本文旨在为大家收集整理.NET/.NET Core中常用的定时任务框架和组件,希望对你有帮助。
如果你还有其他的或者更好的框架/组件,欢迎留言反馈。
码友网:一个专注.NET/.NET Core开发的编程爱好者社区
C#/.NET/.NET Core定时任务调度的方法或者组件[转载]的更多相关文章
- C#/.NET/.NET Core定时任务调度的方法或者组件有哪些--Timer,FluentScheduler还是...
原文:C#/.NET/.NET Core定时任务调度的方法或者组件有哪些--Timer,FluentScheduler还是... 原文由Rector首发于 码友网 之 <C#/.NET/.NET ...
- C#/.NET/.NET Core定时任务调度的方法或者组件有哪些--Timer,FluentScheduler,TaskScheduler,Gofer.NET,Coravel,Quartz.NET还是Hangfire?
原文由Rector首发于 码友网 之 <C#/.NET/.NET Core应用程序编程中实现定时任务调度的方法或者组件有哪些,Timer,FluentScheduler,TaskSchedule ...
- .Net Core 商城微服务项目系列(十五): 构建定时任务调度和消息队列管理系统
一.系统描述 嗨,好久不见各位老哥,最近有点懒,技术博客写的太少了,因为最近在写小说,写的顺利的话说不定就转行了,哈哈哈哈哈哈哈哈哈. 今天要介绍的是基于.Net Core的定时任务调度和消息队列管理 ...
- spring timetask 定时任务调度
作者:Garry1115 定时任务调度即在设置的特定时间执行特定的任务,不需要人工干预. spring timertask spring 自身所带定时任务类,不需要引入第三方jar包,使用方式如下: ...
- linux下定时执行任务方法【转】
之前就转过一篇关于定时任务的文章,前俩天用,还的翻出来看!!!再转一次,备用,,需要的时候不用麻烦找! ----------------------------------------------- ...
- 几种任务调度的 Java 实现方法与比较--转载
前言 任务调度是指基于给定时间点,给定时间间隔或者给定执行次数自动执行任务.本文由浅入深介绍四种任务调度的 Java 实现: Timer ScheduledExecutor 开源工具包 Quartz ...
- Java定时任务调度详解
前言 在实际项目开发中,除了Web应用.SOA服务外,还有一类不可缺少的,那就是定时任务调度.定时任务的场景可以说非常广泛,比如某些视频网站,购买会员后,每天会给会员送成长值,每月会给会员送一些电影券 ...
- Spring4.0.1+Quartz2.2.1实现定时任务调度[亲测可用]
Spring4.0.1+Quartz2.2.1实现定时任务调度[亲测可用] tip:只需要配置xml文件即可 1.第三方依赖包的引入 <properties> <project.bu ...
- SpringQuartz 实现定时任务调度
最近公司新项目需要用到定时器,于是研究了一下发现: Spring中使用Quartz有两种方式实现: 第一种是任务类继承QuartzJobBean 第二种则是在配置文件里定义任务类和要执行的方法,类和方 ...
- 一文揭秘定时任务调度框架quartz
之前写过quartz或者引用过quartz的一些文章,有很多人给我发消息问quartz的相关问题, quartz 报错:java.lang.classNotFoundException quartz源 ...
随机推荐
- R语言遍历文件夹求取其中所有栅格文件的平均值
本文介绍基于R语言中的raster包,遍历读取多个文件夹下的多张栅格遥感影像,分别批量对每一个文件夹中的多个栅格图像计算平均值,并将所得各个结果栅格分别加以保存的方法. 其中,本文是用R语言来 ...
- Redis的几种应用实战
1.分布式锁: 实现:用set key value ex time nx指令实现,这个指令以及其参数是原子性的操作.释放锁用del key,释放之前先比较一下value是否与当前的value一样,原因 ...
- T3/A40i升级,推荐全志T507-H的5个理由!
作为能源电力.工业自动化领域的国产中坚力量,全志T3/A40i处理器国产平台一直深受广大客户的喜爱,甚有"国产工业鼻祖处理器"之称.自创龙科技推出T3/A40i全国产工业核心板(S ...
- 全志A40i+Logos FPGA开发板(4核ARM Cortex-A7)硬件说明书(上)
前 言 本文档主要介绍TLA40iF-EVM工业评估板硬件接口资源以及设计注意事项等内容. 核心板的ARM端和FPGA端的IO电平标准一般为3.3V,上拉电源一般不超过3.3V,当外接信号电平与IO电 ...
- DAX 自动生成日期表-与订单表(业绩表)相同日期区间
日期表 = ADDCOLUMNS ( CALENDAR (MIN('业绩表'[日期]), MAX('业绩表'[日期])), //关键在于MIN函数和MAX函数的使用 "年度", Y ...
- SQLCel匹配原数据信息,更新原数据所有信息并插入新数据的过程
使用SQLCel高效率(速度快,数据完整)的解决了我领导提的问题 "如何更新数据库中原有的数据并插入新的订单数据" 过程如下: 思路:使用字段匹配和修改字段即可解决问题,用时3分钟 ...
- Maven的依赖详解和打包方式
设置maven maven下载与安装教程: https://blog.csdn.net/YOL888666/article/details/122008374 1. 在File->setting ...
- Lambda表达式常见用法
Lambda介绍 Lambda,别名函数式编程 函数式编程是一种编程范式.它把计算当成是数学函数的求值,从而避免改变状态和使用可变数据.它是一种声明式的编程范式,通过表达式和声明而不是语句来编程. L ...
- SpringBoot异步任务EnableAsync
什么是一部任务和使用场景:适用于处理log.发送邮件.短信...等 下单接口->查库存 1000 余额校验 1500 风控用户 1000 启动类里面使用@EnableAsync注解开启功能,自动 ...
- Eggjs 设置跨域请求 指定地址跨域 nodejs
首先egg自身框架没有直接设置允许跨域请求的功能和接口,所以需要第三方包来设置跨域请求! 先安装第三方包来设置跨域,使用egg-cors // npm npm i egg-cors --save // ...