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中怎么结束线程(这个线程是定时执行的)(方案二)
上篇博客中提出了一个问题:怎么结束一个定时循环执行的线程,并给出了一个解决方案,但是又出现了一个问题,详细去参考上一篇博客. 然后出去撒了个尿,突然脑子里出现了一个想法(看来工作和思考久了,出去走走, ...
随机推荐
- Golang源码学习:调度逻辑(三)工作线程的执行流程与调度循环
本文内容主要分为三部分: main goroutine 的调度运行 非 main goroutine 的退出流程 工作线程的执行流程与调度循环. main goroutine 的调度运行 runtim ...
- OpenResty应用实践
一. 安装OpenResty 创建OpenResty用户 # useradd -M www -s /usr/sbin/nologin 安装OpenResty # apt-get install lib ...
- 【C++】常见易犯错误之数值类型取值溢出与截断(3)
0. 前言 本节是“[C++]常见易犯错误之数值类型取值溢出与截断(1)” 的补充,主要探讨浮点型的取值溢出. 1. 相关知识 (1) 浮点型数据取值范围如下: 单精度型 float 3.4 * 1 ...
- [翔哥高手无敌之路]0-002.如何提取apk中的信息?
面对一款apk软件,我们如何去获取它的信息,如何获取它的版本号,包名,或者ID,用户权限,这些信息都隐藏在apk包中的AndroidManifest.xml文件中,解开它我们就能获取任何想要的信息.但 ...
- 读Pyqt4教程,带你入门Pyqt4 _005
对话框窗体或对话框是现代GUI应用不可或缺的一部分.dialog定义为两个或多个人之间的交谈.在计算机程序中dialog是一个窗体,用来和程序“交谈”.对话框用来输入数据.修改数据.改变程序设置等等. ...
- Parrot os更新内核及/boot空间清理
升级时发现boot,空间满了,卸载以前的内核,清理空间. 如何升级内核请查看我上篇博客:https://www.cnblogs.com/junsec/p/11453049.html 卸载多余内核,清理 ...
- 485通信——驱动 MX64/MX28 舵机
背景:在使用STM32调试MX64舵机时,由于控制该舵机需要采用RS485通信协议,因此需要从单片机的串口经过一个TTL转485通信的模块再与舵机进行通信. 485通信特点: 485通信采用差分信号: ...
- 01 . Memcached简介及部署
Memcached简介 memcached是一个自由开源,高性能,分布式内存对象存储系统 基于内存的key-valued存储,用来存储小块的任意数据(字符串,对象) 他是一个简洁的key-value存 ...
- Rocket - debug - Example: Triggers
https://mp.weixin.qq.com/s/zPNyrBOhsytkRrZTDTEvpw 介绍riscv-debug的使用实例:配置Triggers功能. 1. Trigger Trigge ...
- Chisel3 - util - Arbiter
https://mp.weixin.qq.com/s/7Y23gV6yPvtmvKHTo2I8mw 基于ReadyValid接口实现的多入单出仲裁器. 参考链接: https://github ...