C# 实现定时/循环任务
用C#实现定时/循环任务,需要使用到Quartz,在项目的NuGet包管理中可以找到并添加。一般还会伴随安装一个Log4Net,主要用它来记录在任务执行过程中遇到的问题。这边主要是讲实现定时/循环任务,就不再赘述。

要实现定时/循环任务,就需要用到C#的作业和触发器
作业:
1.作业创建:
JobBuilder.Create<TestJob>() 这里的<TestJob>就是你实现具体任务的类
IJobDetail job1 = JobBuilder.Create<TestJob>()
.WithIdentity(jobName, gropName) //为该job的jobName和gropName赋值,相当于给予一个身份(非必须)
.UsingJobData("key", "value")//为作业的具体任务传递参数,键值对(非必须)
.Build();//创建作业(必须)
2.作业的具体任务
这时候要创建一个类,继承IJob,并实现接口方法,此方法是触发器触发时调用的方法,所以在这里写你的任务。
using log4net;
using Quartz;
using System;using System.Threading.Tasks; namespace BackgroundTask.job
{
public class TestJob : IJob
{
private readonly ILog _log = LogManager.GetLogger(typeof(TestJob));//利用Log来记录在任务执行过程中遇到的问题
public void Execute(IJobExecutionContext context)
{
JobDataMap dataMap = context.JobDetail.JobDataMap;
string k = dataMap.GetString("key");//在这里获取到参数,有GetInt,GetXXX等等,满足参数的类型需求// 以下开始写你的任务代码,
Console.WriteLine(“123321”);
}
}
}
触发器:
1.触发器的声明
现在的版本,触发器创建和设置需要采用异步方法。
IScheduler scheduler = await StdSchedulerFactory.GetDefaultScheduler(); //从工厂中获取一个调度器实例化
2.触发器的设置
循环触发器设置:
// 创建触发器
ITrigger trigger1 = TriggerBuilder.Create()
.WithIdentity(tiggerName, gropName) //为触发器的tiggerName和gropName赋值,相当与给予一个身份
.StartNow() //现在开始
.WithSimpleSchedule(x => x
.WithIntervalInSeconds() //触发时间,10秒一次。
.RepeatForever()) //不间断重复执行
.Build(); //最终创建 await scheduler.ScheduleJob(job1, trigger1); //把作业,触发器加入调度器。
await scheduler.Start();
定时触发器设置:
ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
//.StartAt(startTime).EndAt(endTime) //开始时间,结束时间
.WithCronSchedule(cronExpression) //设置定时触发规则 cronExpression字符串就包含了规则
.Build(); //最终创建 await scheduler.ScheduleJob(job1, trigger); await scheduler.Start();
任务和触发器的关闭
还记得在创建作业和触发器时候给的那个身份吗?在关闭的时候可以指定关闭对象
TriggerKey triggerKey = new TriggerKey(tiggerName, gropName);
JobKey jobKey = new JobKey(jobName, gropName);
if (scheduler != null)
{
scheduler.PauseTrigger(triggerKey);
scheduler.UnscheduleJob(triggerKey);
scheduler.DeleteJob(jobKey);
scheduler.Shutdown();// 关闭
}
自此,我们对实现定时/循环任务就有了个清晰的思路
1 新建一个控制台项目。
2 建一个类,在此类中创建作业和触发器。
3 再建一个类,此类继承IJob接口,实现Excute方法。此类作为作业的具体实行任务。
4 执行该项目。
附带知识点:
CronExpression 规则


C# 实现定时/循环任务的更多相关文章
- PHP 后台定时循环刷新某个页面 屏蔽apache意外停止
PHP 后台定时循环刷新某个页面 如果间隔时间过长的话 会出现apache自动停止的现象.出现的原因则是设置了 <IfModule mpm_winnt_module> ThreadsPe ...
- Android Timer 的 schedule()方法定时循环切换图片
void java.util.Timer.schedule(TimerTask task, long delay, long period)第一个参数,是 TimerTask 类,在包:import ...
- winform视频教程-任务定时循环执行小工具
有时候,我们可能遇到这样的一种需求,就是需要有一个小工具,在服务器中不断的执行一些任务,那么这样的需求,我们可以做一个windows服务程序,或者做一个winform wpf等小程序,然后小程序里面开 ...
- Java 定时循环运行程序
Timer 和 ScheduledExecutorSeruvce 都能执行定时的循环任务,有函数 scheduleAtFixedRate.但是,如果任务运行时间较长,超过了一个周期时长,下一个任务就会 ...
- mysql 定时计划任务 wish 按照id分组定时循环启动
SELECT count(*) FROM wish_sellers_in;UPDATE wish_sellers_in SET act_status =0 WHERE id >=1 AND ...
- JS定时循环
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- python 实现定时循环触发某个方法
直接贴上代码 import threading def sayhello(): print "hello world" global t #Notice: use global v ...
- VC中基于 Windows 的精确定时[转]
在工业生产控制系统中,有许多需要定时完成的操作,如定时显示当前时间,定时刷新屏幕上的进度条,上位 机定时向下位机发送命令和传送数据等.特别是在对控制性能要求较高的实时控制系统和数据采集系统中,就更需要 ...
- Delphi中怎么结束线程(这个线程是定时执行的)(方案二)
上篇博客中提出了一个问题:怎么结束一个定时循环执行的线程,并给出了一个解决方案,但是又出现了一个问题,详细去参考上一篇博客. 然后出去撒了个尿,突然脑子里出现了一个想法(看来工作和思考久了,出去走走, ...
随机推荐
- SpringBoot自定义装配的多种实现方法
Spring手动装配实现 对于需要加载的类文件,使用@Configuration/@Component/@Service/@Repository修饰 @Configuration public cla ...
- CNN卷积神经网络的卷积层、池化层的输出维度计算公式
卷积层Conv的输入:高为h.宽为w,卷积核的长宽均为kernel,填充为pad,步长为Stride(长宽可不同,分别计算即可),则卷积层的输出维度为: 其中上开下闭开中括号表示向下取整. MaxPo ...
- 04 . Python入门之条件语句
一. Python条件语句 Python条件语句是通过一条或多条语句执行结果(True或False)来决定执行的代码块. 可以通过下图简单了解语句的执行过程 Python程序语言指定任何非0和非空(n ...
- Rocket - debug - Example: Accessing Registers Using Abstract Command
https://mp.weixin.qq.com/s/RdJzE06mMkh2x__vVj_fEA 介绍riscv debug接口的使用实例:使用抽象命令读取寄存器. 1. Read s0 using ...
- Java面向对象中this关键字详解 意义+实例讲解【hot】
this关键字 >>>便于理解简单的定义 this关键字可以简单的理解为,谁调用this所在的方法,this就是谁. 类的构造函数与getter.setter方法常用到this关键字 ...
- TCP / IP 精彩回顾-必看
TCP/IP 协议出现的原因是互联网世界各个主机作为一个个独立的个体,如何制定统一的规则让他们互相通信是达成万物互联的纽带.基于此,设定了 TCP/IP 协议来规范网络访问行为.TCP/IP 并不是一 ...
- css定位和css3的基本
定位方式:position需要搭配left|right |top |bottom 1.相对定位:相对于自身的位置进行偏移position: relative; 2.绝对定位:相对于有position属 ...
- MyBatis(一) 概述与SQL定制、对象映射
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.MyBatis概述 1.mybatis简介 MyBatis 是支持定制化 SQL.存储过程以及高级映 ...
- Java实现 LeetCode 621 任务调度器(暴力大法)
621. 任务调度器 给定一个用字符数组表示的 CPU 需要执行的任务列表.其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务.任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时 ...
- Java实现 LeetCode 519 随机翻转矩阵
519. 随机翻转矩阵 题中给出一个 n 行 n 列的二维矩阵 (n_rows,n_cols),且所有值被初始化为 0.要求编写一个 flip 函数,均匀随机的将矩阵中的 0 变为 1,并返回该值的位 ...