如果用知乎,可以关注专栏:.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

.NET平台开源项目速览(21)Cron任务调度CronNET的更多相关文章

  1. .NET平台开源项目速览(17)FluentConsole让你的控制台酷起来

    从该系列的第一篇文章 .NET平台开源项目速览(1)SharpConfig配置文件读写组件 开始,不知不觉已经到第17篇了.每一次我们都是介绍一个小巧甚至微不足道的.NET平台的开源软件,或者学习,或 ...

  2. .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验

    不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...

  3. .NET平台开源项目速览(13)机器学习组件Accord.NET框架功能介绍

    Accord.NET Framework是在AForge.NET项目的基础上封装和进一步开发而来.因为AForge.NET更注重与一些底层和广度,而Accord.NET Framework更注重与机器 ...

  4. .NET平台开源项目速览(1)SharpConfig配置文件读写组件

    在.NET平台日常开发中,读取配置文件是一个很常见的需求.以前都是使用System.Configuration.ConfigurationSettings来操作,这个说实话,搞起来比较费劲.不知道大家 ...

  5. .NET平台开源项目速览(12)哈希算法集合类库HashLib

    .NET的System.Security.Cryptography命名空间本身是提供加密服务,散列函数,对称与非对称加密算法等功能.实际上,大部分情况下已经满足了需求,而且.NET实现的都是目前国际上 ...

  6. .NET平台开源项目速览(11)KwCombinatorics排列组合使用案例(1)

    今年上半年,我在KwCombinatorics系列文章中,重点介绍了KwCombinatorics组件的使用情况,其实这个组件我5年前就开始用了,非常方便,麻雀虽小五脏俱全.所以一直非常喜欢,才写了几 ...

  7. .NET平台开源项目速览(10)FluentValidation验证组件深入使用(二)

    在上一篇文章:.NET平台开源项目速览(6)FluentValidation验证组件介绍与入门(一) 中,给大家初步介绍了一下FluentValidation验证组件的使用情况.文章从构建间的验证器开 ...

  8. .NET平台开源项目速览(9)软件序列号生成组件SoftwareProtector介绍与使用

    在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Software Protector序列号生成组件.今天就通过一篇简单的文章来预览一下其强大的功 ...

  9. .NET平台开源项目速览(8)Expression Evaluator表达式计算组件使用

    在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Expression Evaluator验证组件.那里只是概述了一下,并没有对其使用和强大功能做 ...

随机推荐

  1. Docker Compose容器编排

    Compose是Docker官方的开源项目,可以实现对Docker容器集群的快速编排.Compose 中有两个重要的概念:服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实 ...

  2. ES6,Array.fill()函数的用法

    ES6为Array增加了fill()函数,使用制定的元素填充数组,其实就是用默认内容初始化数组. 该函数有三个参数. arr.fill(value, start, end) value:填充值. st ...

  3. SDP(6):分布式数据库运算环境- Cassandra-Engine

    现代信息系统应该是避不开大数据处理的.作为一个通用的系统集成工具也必须具备大数据存储和读取能力.cassandra是一种分布式的数据库,具备了分布式数据库高可用性(high-availability) ...

  4. SUSE-11 本地 zypper 配置

    配置本地 zypper 目的: 安装 SUSE-11 后想要再添加或删除软件组件将比较麻烦.通过配置本地 zypper 将可以从下载的软件仓库(repository)中安装软件包.   本地 zypp ...

  5. 聊聊一直困扰前端程序员的浏览器兼容-【css】

    1.为什么会出现浏览器兼容问题? 由于各大主流浏览器由不同的厂家开发,所用的核心架构和代码也很难重和,这就为各种莫名其妙的Bug(代码错误)提供了温床.再加上各大厂商出于自身利益考虑而设置的种种技术壁 ...

  6. Android查缺补漏(IPC篇)-- 款进程通讯之AIDL详解

    本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8436529.html 进程间通讯篇系列文章目录: Android查缺补漏(IP ...

  7. Java经典编程题50道之二十五

    一个5位数,判断它是不是回文数.即12321是回文数,个位与万位相同,十位与千位相同. public class Example25 {    public static void main(Stri ...

  8. Spring-Security自定义登录页&inMemoryAuthentication验证

    Spring Security是为基于Spring的应用程序提供声明式安全保护的安全性框架.框架下内容比较多,可以做到按照角色权限对请求路径进行限制.今天主要验证自定义登录页,在内存用户存储中进行请求 ...

  9. SQLSERVER中分割字符串成多列

    今天修改到之前的大佬的代码,居然把多个Id存在一个列里面,还是用的逗号分割...特么查询的时候怎么办??? 网上搜索了半天,终于找到了SqlServer里面有一个PARSENAME函数,可以按.(点) ...

  10. DAY1--JAVA

    学习路线 2017-1-27打卡学习,先学习第一部分Java基础. 面向对象 面向对象---它是从现实世界中客观存在的事物(即对象)出发,并在系统构造中尽可能的运用人类自然的思维方式,来构建软件系统. ...