.NET Core C#系列之XiaoFeng.Threading.JobScheduler作业调度

   2023-02-09 学习力0
核心提示:作业调度其实就是一个定时器,定时完成某件事,比如:每分钟执行一次,每小时执行一次,每天执行一次,第二周几执行,每月几号几点执行,间隔多少个小时执行一次等。作业类:XiaoFeng.Threading.Job主调度类:XiaoFeng.Threading.JobScheduler先介绍一下 IJob

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

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

作业类: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

开源不易,多多支持~

 

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 使用C#编写一个.NET分析器(一) 使用csv模块的什么方法可以一次性将一行数据写入文件
    使用C#编写一个.NET分析器(一) 使用csv模块的
    译者注这是在Datadog公司任职的Kevin Gosse大佬使用C#编写.NET分析器的系列文章之一,在国内只有很少很少的人了解和研究.NET分析器,它常被用于APM(应用性能诊断)、IDE、诊断工具中,比如Datadog的APM,Visual Studio的分析器以及Rider和Reshaper等等。之前
    03-08
  • 跨语言调用C#代码的新方式-DllExport 跨语言调用本质
    跨语言调用C#代码的新方式-DllExport 跨语言调
    简介上一篇文章使用C#编写一个.NET分析器文章发布以后,很多小伙伴都对最新的NativeAOT函数导出比较感兴趣,今天故写一篇短文来介绍一下如何使用它。在以前,如果有其他语言需要调用C#编写的库,那基本上只有通过各种RPC的方式(HTTP、GRPC)或者引入一层C++
    03-08
  • 我比较了 Go 和 C# 的速度
    我比较了 Go 和 C# 的速度
    我在 Go 和 C# 之间进行了速度比较。我通常使用 C#,但我有机会使用 Go,并且由于传闻 Go 速度很快,所以我实际测量了它。测量内容我在 Go 和 C# 中执行了一个简单的循环和判断过程,以查看整数 2 到 N 是否为质数。来源是Github参考。测量模式 逻辑内核 8 Wi
    03-08
  • [C#]使用 AltCover 获得代码覆盖率 - E2E Test 和 Unit Test
    [C#]使用 AltCover 获得代码覆盖率 - E2E Test
    背景在 CI/CD 流程当中,测试是 CI 中很重要的部分。跟开发人员关系最大的就是单元测试,单元测试编写完成之后,我们可以使用 IDE 或者 dot cover 等工具获得单元测试对于业务代码的覆盖率。不过我们需要一个独立的 CLI 工具,这样我们才能够在 Jenkins 的 CI
  • C#中LINQ的Select与SelectMany函数如何使用 c反应蛋白高说明什么
    C#中LINQ的Select与SelectMany函数如何使用 c反
    本篇内容主要讲解“C#中LINQ的Select与SelectMany函数如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#中LINQ的Select与SelectMany函数如何使用”吧!LINQ的Select与SelectMany函数使用Select扩展函
    02-09 linqselect
  • PerfView专题 (第三篇):如何寻找 C# 中的 VirtualAlloc 内存泄漏
    PerfView专题 (第三篇):如何寻找 C# 中的 Virt
    一:背景上一篇我们聊到了如何用 PerfView 去侦察 NTHeap 的内存泄漏,这种内存泄漏往往是用 C 的 malloc 或者 C++ 的 new 分配而不释放所造成的,这一篇我们来聊一下由 VirtualAlloc 方法造成的泄漏如何去甄别?了解 VirtualAlloc 的朋友肯定说, C# 这种高
    02-09
  • Blazor和Vue对比学习(知识点杂锦3.04):Blazor中C#和JS互操作(超长文)
    Blazor和Vue对比学习(知识点杂锦3.04):Blazo
    C#和JS互操作的基本语法是比较简单的,但小知识点特别多,同时,受应用加载顺序、组件生命周期以及参数类型的影响,会有比较多坑,需要耐心的学习。在C#中调用JS的场景会比较多,特别是在WASM模式下,由于WebAssembly的限制,很多时候,还是需要借助JS去控制D
    02-09
  • 的键">C#怎么使用struct类型作为泛型Dictionary
    本文小编为大家详细介绍“C#怎么使用struct类型作为泛型DictionaryTKey,TValue的键”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#怎么使用struct类型作为泛型DictionaryTKey,TValue的键”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学
  • C#如何实现折半查找算法 彩票查询
    C#如何实现折半查找算法 彩票查询
    本篇内容主要讲解“C#如何实现折半查找算法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#如何实现折半查找算法”吧!折半查找,也叫二分查找,当在一个数组或集合中查找某个元素时,先定位出中间位置元素
    02-09
  • C#如何实现选择排序 c罗
    C#如何实现选择排序 c罗
    本篇内容主要讲解“C#如何实现选择排序”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#如何实现选择排序”吧!选择排序是一种低效的排序算法,大致过程是:遍历数组的每一个元素,先假设0号位置上的元素是最
    02-09
点击排行