官网地址Longbow.Tasks

使用说明

dll引用

  • 使用NuGet 搜索Longbow.Task可找到相关版本的dll

    目前最新的为7.0.0版本,需net6.0+

    如果低版本用户可使用5.2.1

  • 直接下载源码编译即可

dll引入程序

  • .netcore 容器注入
services.AddTaskServices();
  • donet4.5+ 使用
// 程序入口调用
TaskServicesManager.Init();

自定义业务实现(Job)

  • 自定义业务类

    /// <summary>
    /// 后台任务实现类
    /// </summary>
    public class FooTask : ITask
    {
    /// <summary>
    /// 后台任务具体业务操作
    /// </summary>
    public async Task Execute(CancellationToken cancellationToken)
    {
    // 模拟任务执行耗时500毫秒
    try
    {
    await Task.Delay(500, cancellationToken);
    }
    catch (TaskCanceledException) { }
    if (cancellationToken.IsCancellationRequested)
    {
    return;
    }
    // do something ...
    }
    }
  • 将自定义业务类添加到程序中

    // 1.将FooTask添加,默认使用内部的触发器
    TaskServicesManager.GetOrAdd<FooTask>().Task.Execute(default);
    // 2.设置触发器Cron
    // 每分钟的第 5 秒循环执行任务
    TaskServicesManager.GetOrAdd<FooTask>("表达式任务", token => Task.Delay(1000), TriggerBuilder.Build("5 * * * * *"));

测例代码说明

CronTest测例

  • DateTimeOffset 与DateTime的不同:多存储了时区

  • 通过Cron类来获得下次执行的时间

    var now = DateTimeOffset.Now;
    // 1.当前时间加5s与后者相等
    // Cron.Secondly():返回Cron的string
    // ParseCronExpression(): 将string转换为CronExpression
    // GetNextExecution:通过参数的时间来获得下次执行的时间
    Assert.Equal(now.AddSeconds(5), Cron.Secondly(5).ParseCronExpression().GetNextExecution(now));
    // 2.每 2 秒 执行一次
    var cron = "*/2 * * * * *".ParseCronExpression();
    // 获取一个一分钟之内的任务列表
    var nextRuntimes = cron.GetOccurrences(now, now.AddMinutes(1), TimeZoneInfo.Local).Take(3).ToList();
    // 每个任务间隔时间为2s
    Assert.Equal(nextRuntimes[0].AddSeconds(2), nextRuntimes[1]);
    Assert.Equal(nextRuntimes[1].AddSeconds(2), nextRuntimes[2]);
    // 3.cron必须按照时间规格来设置,不能超过

DictionaryTest测例

// ConcurrentDictionary进行AddOrUpdate时,如果内部使用了并发代码,需要使用懒加载模式
var tasks = Enumerable.Range(1, 5).Select(i => Task.Run(() =>
{
var temp = pool.AddOrUpdate("Test", key => new Lazy<string>(() =>
{
var t = GenerateValue(i); //返回的为Task<string>
t.Wait();
return t.Result;
}), (key, value) => new Lazy<string>(() =>
{
var t = UpdateValue(i); //返回的为Task<string>
t.Wait();
return t.Result;
}));
}));

ScheduleTaskTest测例

// 1.CancellationTokenSource的WaitOne方法
var cts = new CancellationTokenSource();
// 返回false表示2s已经过去,任务未结束
Assert.False(cts.Token.WaitHandle.WaitOne(2000));
// 1s后结束任务
cts.CancelAfter(1000);
// 返回true,表示2s内任务已经结束
Assert.True(cts.Token.WaitHandle.WaitOne(2000));
// 2.TriggerBuilder触发器
// 每秒执行一次,无超时时间,从当前时间开始,第三个参数可为空,表示当前时间
TriggerBuilder.Build(Cron.Secondly(), -1, DateTimeOffset.Now);
// 创建当前时间的触发器
TriggerBuilder.Default.WithStartTime().Build();
// 以1000毫秒为周期的触发器
TriggerBuilder.Default.WithInterval(1000).Build();
// 设置超时时间为1s,第二个参数不设置则为Timeout.InfiniteTimeSpan
TriggerBuilder.Build(Cron.Secondly(), 1000);

TaskManagerTest测例

// 1.开始任务
// Foo2Task重载ExecutableTask方法并实现ConfigureStartInfo接口
// Command和Argumens为命令行的相关参数
var sche = TaskServicesManager.GetOrAdd<Foo2Task>();
await Task.Delay(300);
// 执行
await sche.Task.Execute(default);
// 2.触发器执行后的回调函数
sche.Triggers.First().PulseCallback = t =>{};

TaskStorageTest测例

// 1.当持久化以后,再次GetOrAdd时任务体不会被执行
TaskServicesManager.GetOrAdd("StorageRunOnce", token =>
{
return Task.CompletedTask;
}); // 2.利用发射获得 IStorage 实例
var factory = typeof(TaskServicesManager).GetProperty("Factory", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
var instance = factory.GetValue(null, null);
var storageInstance = instance.GetType().GetProperty("Storage").GetValue(instance);
var option = storageInstance.GetType().GetProperty("Options").GetValue(storageInstance) as FileStorageOptions;
option.DeleteFileByRemoveEvent = true;
TaskServicesManager.Clear();
option.DeleteFileByRemoveEvent = false;

相关文档

Wiki: 传送门

定时调度插件------Longbow.Tasks的更多相关文章

  1. .NET Core 实现后台任务(定时任务)Longbow.Tasks 组件(三)

    原文链接:https://www.cnblogs.com/ysmc/p/16512309.html 在上两篇文章中,简单介绍了怎么使用 IHostedService 与 BackgroundServi ...

  2. Java学习笔记 -- Java定时调度工具Timer类

    1 关于 (时间宝贵的小姐姐请跳过) 本教程是基于Java定时任务调度工具详解之Timer篇的学习笔记. 什么是定时任务调度 基于给定的时间点,给定的时间间隔或者给定的执行次数自动执行的任务. 在Ja ...

  3. SpringBoot系列九:SpringBoot服务整合(整合邮件服务、定时调度、Actuator监控)

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:SpringBoot 服务整合 2.背景 在进行项目开发的时候经常会遇见以下的几个问题:需要进行邮件发送.定时的任务调 ...

  4. java定时调度器解决方案分类及特性介绍

    什么是定时调度器? 我们知道程序的运行要么是由事件触发的,而这种事件的触发源头往往是用户通过ui交互操作层层传递过来的:但是我们知道还有另外一种由机器系统时间触发的程序运行场景.大家想想是否遇到或者听 ...

  5. ASP.NET Core使用Quartz定时调度

    在应用程序开发过程中,经常会需要定时任务调度功能,本篇博客介绍Asp.net Core如何使用Quartz完成定时调度 一.Quartz使用步骤 创建调度器scheduler,并开启 创建Job作业 ...

  6. Quartz定时调度框架

    Quartz定时调度框架CronTrigger时间配置格式说明 CronTrigger时间格式配置说明 CronTrigger配置格式: 格式: [秒] [分] [小时] [日] [月] [周] [年 ...

  7. Spring Quartz定时调度任务配置

    applicationContext-quartz.xml定时调度任务启动代码: <?xml version="1.0" encoding="UTF-8" ...

  8. 定时调度框架Quartz随笔

    最近项目中的定时批处理用到了quartz定时任务,在此记录下quartz的配置吧,一个小demo仅供参考,也方便自己今后复习! 下面直接来步骤吧! 一.首先,要搭起能让quartz正常运行的环境,至少 ...

  9. wordpress自动批量定时发布插件 DX-auto-publish

    DX-auto-publish是一款wordpress自动发布插件,方便实用. 该wordpress插件的主要功能如下: 1.能够自动批量定时发布wordpress站点的草稿文章,无需每篇文章都手动设 ...

  10. crontab 定时调度

    crontab -e */1 8-23 * * * /www/target/sh/myorder.sh & 0 1 * * * /www/target/php/sh/mymoney.sh &a ...

随机推荐

  1. JS 学习笔记(一)常用的字符串去重方法

    要求:从输入框中输入一串字符,按回车后输出去重后的字符串 方法一: <body> <input type="text" id="input" ...

  2. 【深入浅出 Yarn 架构与实现】1-2 搭建 Hadoop 源码阅读环境

    本文将介绍如何使用 idea 搭建 Hadoop 源码阅读环境.(默认已安装好 Java.Maven 环境) 一.搭建源码阅读环境 一)idea 导入 hadoop 工程 从 github 上拉取代码 ...

  3. zk系列一:zookeeper基础介绍

    聊完kafka必不可少的需要再聊一聊zk了,下面开始 一.ZK是什么 ZooKeeper是分布式应用程序的高性能协调服务.它可以实现分布式的选主.统一配置管理,命名,分布式节点同步,分布式锁等分布式常 ...

  4. Windows骚操作

    电脑常用的快捷键 键盘功能健:Tab.Shift.Ctrl.Alt.Windows.Enter.空格.上下左右健.CapsLock(大小写转换).NumLock(对小键盘控制开/关) 键盘快捷键:全选 ...

  5. 又拍云之 Keepalived 高可用部署

    在聊 Keepalived 之前,我们需要先简单了解一下 VRRP.VRRP(Virtual Router Redundancy Protocol)即虚拟路由冗余协议,是专门为了解决静态路由的高可用而 ...

  6. 二叉树总结——BiTree

    在C++编译器下可直接运行 #include <stdio.h> #include <malloc.h> //算法思想:先读入根结点数据,并且创建根结点,在读入左子树数据并创建 ...

  7. Centos 7.6 安装部署 openGauss 3.1.0 企业版一主两备集群

    一.安装环境设置 1.1 硬件环境 名称 最低配置 建议配置 测试配置 服务器数量 3 略 略 硬盘 * 至少1GB用于安装openGauss的应用程序.* 每个主机需大约300MB用于元数据存储.* ...

  8. 单节点部署 gpmall 商城

    个人名片: 对人间的热爱与歌颂,可抵岁月冗长 Github‍:念舒_C.ying CSDN主页️:念舒_C.ying 个人博客 :念舒_C.ying 1 修改主机名: [root@localhost ...

  9. Kubernetes_从零开始搭建k8s集群(亲测可用)

    一.前言 本文讲述从零开始搭建k8s集群,均使用国内镜像,版本均统一,使用两个虚拟机,一个主节点,一个从节点,保证k8s一次搭建成功. 注意:Kubernetes,简称K8s,是用8代替名字中间的8个 ...

  10. EluxJS-让你像切蛋糕一样拆解前端巨石应用

    大家好,EluxJS是一套基于"微模块"和"模型驱动"的跨平台.跨框架『同构方案』,欢迎了解... 可怕的巨石怪 工作中最可怕的是什么?是遇到业务复杂且乱作一团 ...