作业调度其实就是一个定时器,定时完成某件事,

比如:每分钟执行一次,每小时执行一次,每天执行一次,第二周几执行,每月几号几点执行,间隔多少个小时执行一次等。

作业类:XiaoFeng.Threading.Job

主调度类:XiaoFeng.Threading.JobScheduler

先介绍一下 IJob接口

/// <summary>
/// 作业接口
/// </summary>
public interface IJob
{
#region 属性
/// <summary>
/// 当前调度
/// </summary>
IJobScheduler Scheduler { get; set; }
/// <summary>
/// 运行状态
/// </summary>
JobStatus Status { get; set; }
/// <summary>
/// 作业数据
/// </summary>
object State { get; set; }
/// <summary>
/// 是否是异步
/// </summary>
bool Async { get; set; }
/// <summary>
/// 已成功运行次数
/// </summary>
int SuccessCount { get; set; }
/// <summary>
/// 失败运行次数
/// </summary>
int FailureCount { get; set; }
/// <summary>
/// 运行日志
/// </summary>
List<string> Message { get; set; }
/// <summary>
/// 取消信号
/// </summary>
CancellationTokenSource CancelToken { get; set; }
/// <summary>
/// 作业ID
/// </summary>
Guid ID { get; }
/// <summary>
/// 作业名称
/// </summary>
string Name { get; set; }
/// <summary>
/// 运行次数
/// </summary>
int Count { get; }
/// <summary>
/// 成功回调
/// </summary>
Action<IJob> SuccessCallBack { get; set; }
/// <summary>
/// 当前任务执行完成后再进入计时队列 此方法最后一定要设置job的状态等待
/// </summary>
Action<IJob> CompleteCallBack { get; set; }
/// <summary>
/// 失败回调
/// </summary>
Action<IJob, Exception> FailureCallBack { get; set; }
/// <summary>
/// 停止作业回调
/// </summary>
Action<IJob> StopCallBack { get; set; }
/// <summary>
/// 最后一次运行时间
/// </summary>
DateTime? LastTime { get; set; }
/// <summary>
/// 下次运行时间
/// </summary>
DateTime? NextTime { get; set; }
/// <summary>
/// 启动时间
/// </summary>
DateTime? StartTime { get; set; }
/// <summary>
/// 最大运行次数
/// </summary>
int? MaxCount { get; set; }
/// <summary>
/// 过期时间
/// </summary>
DateTime? ExpireTime { get; set; }
/// <summary>
/// 运行完是否销毁
/// </summary>
bool IsDestroy { get; set; }
/// <summary>
/// 定时器类型
/// </summary>
TimerType TimerType { get; set; }
/// <summary>
/// 时间
/// </summary>
Time Time { get; set; }
/// <summary>
/// 间隔 单位毫秒
/// </summary>
int Period { get; set; }
/// <summary>
/// 几点,几号,周几(周日为一周的第一天),可用负数,-1代表一天中最后一小时即23点,一周内最后一天即周六,一月内最后一天
/// </summary>
int[] DayOrWeekOrHour { get; set; }
#endregion #region 启动作业
/// <summary>
/// 启动作业
/// </summary>
void Start();
/// <summary>
/// 启动作业
/// </summary>
/// <param name="scheduler">调度</param>
void Start(IJobScheduler scheduler);
#endregion #region 停止作业
/// <summary>
/// 停止作业
/// </summary>
void Stop();
/// <summary>
/// 停止作业
/// </summary>
/// <param name="scheduler">调度</param>
void Stop(IJobScheduler scheduler);
#endregion
}

接下来每种类型写一下实例

1.定时只执行一次也就是多久后执行

var job = new XiaoFeng.Threading.Job
{
Async = true,
Name="作业名称",
TimerType= XiaoFeng.Threading.TimerType.Once,
StartTime= DateTime.Now.AddMinutes(5),
SuccessCallBack = job =>
{
/*到时间执行任务*/
}
};
job.Start();

当前作业为5 分钟后执行一次,然后就是销毁,作业从调度中移除。

也可以用任务去实现当前功能如下代码:

Task.Factory.StartNew(() =>
{
/*等待5分钟*/
Task.Delay(5 * 60 * 1000).Wait();
/*执行作业任务*/
});

2.间隔执行

var job = new XiaoFeng.Threading.Job
{
Async = true,
Name = "作业名称",
TimerType = XiaoFeng.Threading.TimerType.Interval,
Period = 5000,
StartTime = DateTime.Now.AddMinutes(5),
SuccessCallBack = job =>
{
/*到时间执行任务*/
}
};
job.Start();

当前作业为,5分钟后运行,然后每隔5分钟会再执行一次
间隔执行就是每隔一段时间去执行一次任务,也可以用任务去实现当前功能,如下:

 
 
var cancelToken = new CancellationTokenSource();
Task.Factory.StartNew(() =>
{
while (!cancelToken.IsCancellationRequested)
{
/*等待5分钟*/
Task.Delay(5 * 60 * 1000).Wait();
/*执行作业任务*/
}
},TaskCreationOptions.LongRunning);

上边代码同样实现了每间隔5分钟执行一次作业任务

如果想取消当前任务直接调用 cancelToken.Cancel(); 这样就可以取消当前任务了。

3.每天定时执行一次

var job = new XiaoFeng.Threading.Job
{
Async = true,
Name = "作业名称",
TimerType = XiaoFeng.Threading.TimerType.Day,
Time = new XiaoFeng.Threading.Time(2, 0, 0),
StartTime = DateTime.Now.AddMinutes(5),
SuccessCallBack = job =>
{
/*到时间执行任务*/
}
};

当前作业为,5分钟后运行,然后每天2点执行一次

4.每周几几点执行,每月几号几点执行

var job = new XiaoFeng.Threading.Job
{
Async = true,
Name = "作业名称",
TimerType = XiaoFeng.Threading.TimerType.Week,
DayOrWeekOrHour = new int[] { 1, 4 },
Time = new XiaoFeng.Threading.Time(2, 0, 0),
StartTime = DateTime.Now.AddMinutes(5),
SuccessCallBack = job =>
{
/*到时间执行任务*/
}
};
job.Start();

当前作业为,5分钟后运行,然后每周的周一,四的2点执行一 次。

以上就是作业调度的简单使用。

开源地址:https://github.com/zhuovi/XiaoFeng/tree/master/Threading

语雀地址:https://www.yuque.com/fayelf/xiaofeng/yl8tkh

开源不易,多多支持~

.NET Core C#系列之XiaoFeng.Threading.JobScheduler作业调度的更多相关文章

  1. .NET Core C#系列之XiaoFeng.Data.IQueryableX ORM框架

    ​ 当前对象操作数据库写法和EF Core极度类似,因为现在大部分程序员都懒得去写SQL,再一个就是项目作大了或其它原因要改数据库,每次改数据库,那么写的SQL语句大部分要作调整,相当麻烦,并且写SQ ...

  2. 《ASP.NET Core 高性能系列》致敬伟大的.NET斗士甲骨文!

    写在开始 三年前,曾写过一篇文章:从.NET和Java之争谈IT这个行业,当时遭到某些自认为懂得java就了不起的Javaer抨击, 现在可以致敬伟大的.NET斗士甲骨文了 (JDK8以上都需要收费, ...

  3. EntityFramework Core 学习系列(一)Creating Model

    EntityFramework Core 学习系列(一)Creating Model Getting Started 使用Command Line 来添加 Package  dotnet add pa ...

  4. .net core实践系列之SSO-跨域实现

    前言 接着上篇的<.net core实践系列之SSO-同域实现>,这次来聊聊SSO跨域的实现方式.这次虽说是.net core实践,但是核心点使用jquery居多. 建议看这篇文章的朋友可 ...

  5. .net core实践系列之短信服务-目录

    前言 经过两周多的业余时间,终于把该系列的文章写完了.第一次写系列,可能部分关键点并没有覆盖到,如果有疑问的朋友可以随时反馈给我.另外也感谢在我发布文章时给予我方案建议与反馈源码BUG的朋友们.下面是 ...

  6. .net core实践系列之短信服务-架构设计

    前言 上篇<.net core实践系列之短信服务-为什么选择.net core(开篇)>简单的介绍了(水了一篇).net core.这次针对短信服务的架构设计和技术栈的简析. 源码地址:h ...

  7. .net core实践系列之短信服务-为什么选择.net core(开篇)

    前言 从今天我将会写.net core实战系列,以我最近完成的短信服务作为例子.该系列将会尽量以最短的时间全部发布出来.源码也将优先开源出来给大家. 源码地址:https://github.com/S ...

  8. .net core实践系列之短信服务-Sikiro.SMS.Api服务的实现

    前言 上篇<.net core实践系列之短信服务-架构设计>介绍了我对短信服务的架构设计,同时针对场景解析了我的设计理念.本篇继续讲解Api服务的实现过程. 源码地址:https://gi ...

  9. .net core实践系列之短信服务-Api的SDK的实现与测试

    前言 上一篇<.net core实践系列之短信服务-Sikiro.SMS.Api服务的实现>讲解了API的设计与实现,本篇主要讲解编写接口的SDK编写还有API的测试. 或许有些人会认为, ...

随机推荐

  1. 技术分析 | 浅谈在MySQL体系下SQL语句是如何在系统中执行的及可能遇到的问题

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 SQL语句大家并不陌生,但某种程度上来看,我们只是知道了这条语句是什么功能,它可 ...

  2. 我和Apache DolphinScheduler的这一年

    Apache DolphinScheduler,为Apache开源项目, 简称"DS", 中文名 "小海豚调度"(海豚聪明.人性化,又左右脑可互相换班,终生不用 ...

  3. 大家都能看得懂的源码(一)ahooks 整体架构篇

    本文是深入浅出 ahooks 源码系列文章的第一篇,该系列已整理成文档-地址.觉得还不错,给个 star 支持一下哈,Thanks. 第一篇主要介绍 ahooks 的背景以及整体架构. React h ...

  4. Hive存储格式之RCFile详解,RCFile的过去现在和未来

    我在整理Hive的存储格式和压缩格式,本来打算一篇发出来,结果其中一小节就有很多内容,于是打算写成Hive存储格式和压缩格式系列. 本节主要讲一下Hive存储格式最早的典型的列式存储格式RCFile. ...

  5. MyBatis-Plus(二、常用注解)

    1.@TableName @TableName 用法:映射数据库的表名,如果数据库表名与实体类名不一致,用@TableName来映射. package com.example.mybatisplus. ...

  6. 利用 Word 表格对文字、图文进行排版

    在以前,Web 前端工程师利用 <table /> 元素对网页布局进行排版,但是如今却不推荐此元素排版了,而是改用 <div /> 元素和 CSS 弹性布局(或网格布局)对网页 ...

  7. Linux—进程管理

    Linux 进程管理 1.进程管理介绍 1.1 什么是进程? 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础. 简而言之 ...

  8. HTML引用CSS实现自适应背景图

    链接图片背景代码 body {background: url('链接') no-repeat center 0;} 颜色代码 body{background:#FFF} 链接图片背景代码2 <b ...

  9. 【java】学习路径37-练习:任意文件的复制

    使用字节完成复制 import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException ...

  10. 【Java】学习路径34-文件IO练习题

    练习题: 1.检测某目录(scr目录为例)下java源程序文件的数量. 参考思路: 首先获取到scr目录,然后使用list()获取所有名字,再使用String类下的endsWith方法检查即可. 参考 ...