.NET Core C#系列之XiaoFeng.Threading.JobScheduler作业调度
作业调度其实就是一个定时器,定时完成某件事,
比如:每分钟执行一次,每小时执行一次,每天执行一次,第二周几执行,每月几号几点执行,间隔多少个小时执行一次等。
作业类: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作业调度的更多相关文章
- .NET Core C#系列之XiaoFeng.Data.IQueryableX ORM框架
当前对象操作数据库写法和EF Core极度类似,因为现在大部分程序员都懒得去写SQL,再一个就是项目作大了或其它原因要改数据库,每次改数据库,那么写的SQL语句大部分要作调整,相当麻烦,并且写SQ ...
- 《ASP.NET Core 高性能系列》致敬伟大的.NET斗士甲骨文!
写在开始 三年前,曾写过一篇文章:从.NET和Java之争谈IT这个行业,当时遭到某些自认为懂得java就了不起的Javaer抨击, 现在可以致敬伟大的.NET斗士甲骨文了 (JDK8以上都需要收费, ...
- EntityFramework Core 学习系列(一)Creating Model
EntityFramework Core 学习系列(一)Creating Model Getting Started 使用Command Line 来添加 Package dotnet add pa ...
- .net core实践系列之SSO-跨域实现
前言 接着上篇的<.net core实践系列之SSO-同域实现>,这次来聊聊SSO跨域的实现方式.这次虽说是.net core实践,但是核心点使用jquery居多. 建议看这篇文章的朋友可 ...
- .net core实践系列之短信服务-目录
前言 经过两周多的业余时间,终于把该系列的文章写完了.第一次写系列,可能部分关键点并没有覆盖到,如果有疑问的朋友可以随时反馈给我.另外也感谢在我发布文章时给予我方案建议与反馈源码BUG的朋友们.下面是 ...
- .net core实践系列之短信服务-架构设计
前言 上篇<.net core实践系列之短信服务-为什么选择.net core(开篇)>简单的介绍了(水了一篇).net core.这次针对短信服务的架构设计和技术栈的简析. 源码地址:h ...
- .net core实践系列之短信服务-为什么选择.net core(开篇)
前言 从今天我将会写.net core实战系列,以我最近完成的短信服务作为例子.该系列将会尽量以最短的时间全部发布出来.源码也将优先开源出来给大家. 源码地址:https://github.com/S ...
- .net core实践系列之短信服务-Sikiro.SMS.Api服务的实现
前言 上篇<.net core实践系列之短信服务-架构设计>介绍了我对短信服务的架构设计,同时针对场景解析了我的设计理念.本篇继续讲解Api服务的实现过程. 源码地址:https://gi ...
- .net core实践系列之短信服务-Api的SDK的实现与测试
前言 上一篇<.net core实践系列之短信服务-Sikiro.SMS.Api服务的实现>讲解了API的设计与实现,本篇主要讲解编写接口的SDK编写还有API的测试. 或许有些人会认为, ...
随机推荐
- SAM复杂度证明
关于$SAM$的复杂度证明(大部分是对博客的我自己的理解和看法) 这部分是我的回忆,可省略 先回忆一下$SAM$ 我所理解的$SAM$,首先扒一张图 初始串$aabbabd$ 首先发现,下图里的$S- ...
- CF906C Party (状压DP)(未完成//鬼知道啥情况)
CF上下了数据,本地能过,一交就错 这状压不用解释,看代码就懂. #include <iostream> #include <cstdio> #include <cstr ...
- Spring源码 12 IOC refresh方法7
本文章基于 Spring 5.3.15 Spring IOC 的核心是 AbstractApplicationContext 的 refresh 方法. 其中一共有 13 个主要方法,这里分析第 7 ...
- Docker 01 概述
参考源 https://www.bilibili.com/video/BV1og4y1q7M4?spm_id_from=333.999.0.0 https://www.bilibili.com/vid ...
- Chapter 09 - NSUndoManager (C#实现 + 全网原创)
此例子针对NSDocument实现了tableview 每一行添加/删除的undo/redo,以及每一个单元格内容编辑的undo/redo.基于NSDocument类的实现.PersonModel + ...
- PerfView专题 (第十一篇):使用 Diff 功能洞察 C# 内存泄漏增量
一:背景 去年 GC架构师 Maoni 在 (2021 .NET 开发者大会) [https://ke.segmentfault.com/course/1650000041122988/section ...
- java代码审计的点
java代码审计的点 组件的审计 首先看pom.xml查看第三方组件和第三方组件的版本 常用的第三方组件: 第三方组件 漏洞类型 组件漏洞版本 log4j2 远程代码执行 Apache log4j2 ...
- Linux软件包常见的几种下载、安装方法
在线源下载和安装 如果服务器是处于在线状态,在使用默认下载源是外国的情况下,安装更新软件包往往会比较痛苦的存在,下载了许久来一个超时就gg了.国内有许多镜像源,完美的解决了这个问题. 对于rpm系列的 ...
- Windows平台摄像头或屏幕RTMP推送介绍:OBS VS SmartPublisher
好多开发者问道,既然有了OBS,你们为什么还要开发SmartPublisher? 的确,在我们进行Windows平台RTMP推送模块开发之前,市面上为数不多的Windows平台RTMP推流工具当属OB ...
- KingbaseES V8R6集群维护案例之--单实例数据迁移到集群案例
案例说明: 生产环境是单实例,测试环境是集群,现需要将生产环境的数据迁移到集群中运行,本文档详细介绍了从单实例环境恢复数据到集群环境的操作步骤,可以作为生产环境迁移数据的参考. 适用版本: Kingb ...