C# Quartzs定时器的使用方法是什么
发表于:2024-11-22 作者:千家信息网编辑
千家信息网最后更新 2024年11月22日,这篇文章主要介绍"C# Quartzs定时器的使用方法是什么",在日常操作中,相信很多人在C# Quartzs定时器的使用方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对
千家信息网最后更新 2024年11月22日C# Quartzs定时器的使用方法是什么
这篇文章主要介绍"C# Quartzs定时器的使用方法是什么",在日常操作中,相信很多人在C# Quartzs定时器的使用方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"C# Quartzs定时器的使用方法是什么"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
前言
首先想到倒计时,定时任务。大家想到的肯定就是定时器。那么定时器在web和winfrom程序中有着很大的作用。那在服务器端有没有像定时器一样的存在呢。
有了这些需求,我找到了第三方的组件 Quartz.Net 来实现(源码位置)
实现步骤
(1)第一步,通过NuGet下载Quartz.Net组件并且引用到当前工程中
(2)创建两个类,一个是操作类,一个类继承IJob 并且需要实现IJob的方法。
////// 操作类 /// public class Operation : BaseBusiness{ #region 实例化 public Operation() { _options = new Options(); } internal IOptions _options { get; } #endregion public static IScheduler scheduler; public static ISchedulerFactory factory; /// /// 获取cron表达式 /// /// 时间 ///public string GetCron(DateTime? time) { var txt = Convert.ToDateTime(time).ToString("yyyy-MM-dd-HH-mm-ss"); var arr = txt.Split('-'); var result = string.Format("{0} {1} {2} {3} {4} ? {5}", arr[5], arr[4], arr[3], arr[2], arr[1], arr[0]); return result; } /// /// 删除job /// /// 拍卖数据对象主键 /// job的组名 public void RemoveJob(string Id, string MarkGoodsId, string GroupName) { //var jobKey = new JobKey(GroupName + Id + MId + "j", GroupName); var job = new JobKey(GroupName + Id + MarkGoodsId + "j", GroupName); scheduler.DeleteJob(job); } //清楚所有定时任务 public void ClearJob() { if (scheduler != null) { scheduler.Clear(); } } }
public class SetAuctionings : Operation, IJob { public async Task Execute(IJobExecutionContext context) { await Task.Run(() => { DateTime freeTime = context.JobDetail.JobDataMap.GetDateTime("FreeTime"); var now = DateTime.Now; //记录两个时间的差 var days = freeTime.Subtract(now).Days; var hours = freeTime.Subtract(now).Hours; var minutes = freeTime.Subtract(now).Minutes; var seconds = freeTime.Subtract(now).Seconds; var result = days + "天" + hours + "时" + minutes + "分" + seconds + "秒";//推送倒计时 PushHelper.AuctionCountDown(markId, days, hours, minutes, seconds); //getTriggerState }); }////// 设置定时任务 /// /// 标的ID public void AddQz(DateTime BeginTime, DateTime FreeTime) { var GroupName = _options.GetPKById("1316283839361847296").ToString(); factory = new StdSchedulerFactory(); scheduler = factory.GetScheduler().Result; var jobKey = new JobKey(GroupName + Id + MId + "j", GroupName); var GjobDetail = scheduler.GetJobDetail(jobKey); if (GjobDetail != null) { //删除任务 scheduler.DeleteJob(jobKey); } //设置Job StatefulJob var job = JobBuilder.Create () .WithIdentity(GroupName + Id + MId + "j", GroupName) .Build(); job.JobDataMap.Put("FreeTime", FreeTime);//【方法1】 设置每秒执行 ITrigger trigger = TriggerBuilder.Create() .WithIdentity(GroupName + Id + MId + "t", GroupName) .WithSimpleSchedule(x => x.WithIntervalInSeconds(1) .RepeatForever()) .StartAt(new DateTimeOffset(BeginTime)) .EndAt(new DateTimeOffset(FreeTime)) .Build(); //【方法2】 //var ExecSs = "0/1 * * * * ?"; //ITrigger trigger = TriggerBuilder.Create() // .WithIdentity(GroupName + Id + MeetingPlace + "t", GroupName) // .WithCronSchedule(ExecSs) // .StartAt(new DateTimeOffset(BeginTime)) // .EndAt(new DateTimeOffset(FreeTime)) // .Build(); scheduler.ScheduleJob(job, trigger); } }
以上是一个简单的封装,可以根据这个倒计时的推送。增加一些封装 如:暂停,恢复,结束,更新等。
调用的话只需要简单的实例化一下进行调用。
然后我在大概说下其他封装的思路和代码片段;
延时倒计时:
根据传过来的参数时间进行一个修改,删除之前的任务重新开始一个任务;
////// 【拍卖延时】修改倒计时任务 /// /// /// /// public void UpdateQz(String Id, string Mid, DateTime FreeTime, DateTime LimitTime) { //scheduler = factory.GetScheduler().Result; //if (scheduler == null) // return; //拍卖进行中 var GroupName = _options.GetPKById("1316283839361847296").ToString(); var jobKey = new JobKey(GroupName + Id + Mid + "j", GroupName); var GjobDetail = scheduler.GetJobDetail(jobKey); if (GjobDetail.Result == null) return; var triggerKey = new TriggerKey(GroupName + Id + Mid + "t", GroupName); var triggerr = scheduler.GetTrigger(triggerKey); var triggerBuilder = triggerr.Result.GetTriggerBuilder(); //修改结束时间 WithCronSchedule(ExecSs). ITrigger newTrigger = triggerBuilder.EndAt(new DateTimeOffset(FreeTime)).Build(); var job = GjobDetail.Result; job.JobDataMap.Put("AuctionId", Id); job.JobDataMap.Put("MarkId", Mid); job.JobDataMap.Put("FreeTime", FreeTime); job.JobDataMap.Put("LimitTime", LimitTime); //删除任务 scheduler.DeleteJob(jobKey); scheduler.ScheduleJob(job, newTrigger); //修改最终结束的定时任务; SetAuctioneds setAuctioneds = new SetAuctioneds(); setAuctioneds.SetEndQz(Id, FreeTime, Mid); }
倒计时暂停:
调用组件的PauseTrigger方法可以进行暂停;////// 倒计时暂停/// public AjaxResult StopQz(string Id, string MId){ try { //方法1 //拍卖进行中 var GroupName = _options.GetPKById("1316283839361847296").ToString(); var mark = Service.GetIQueryable ().FirstOrDefault(x => x.Id == MId); if (mark == null) return Error("找不到标的!"); //获取实际结束时间。 var subEndTime = mark.EndTime.Value; //计算暂停后剩余的时间 = audEndTime(结束时间) - 当前时间 var nowEndTime = DateTime.Now; var DifferTime = subEndTime.Subtract(nowEndTime); //追加 剩余时间 和 当前结束时间; mark.SurplusTime = DifferTime.ToString(); //mark.EndTime = nowEndTime; //GroupName + Id + MId + "t", GroupName var TriKey = new TriggerKey(GroupName + Id + MId + "t", GroupName); var Result = scheduler.GetTriggerState(TriKey).Result; if (Result == TriggerState.None) { return Error("失败:不存在此任务!"); } if (Result == TriggerState.Paused)//暂停 { return Success("失败:该任务已暂停!"); } else { scheduler.PauseTrigger(TriKey); mark.AucTimeStatus = 2; Service.UpdateAny (mark, new List { "SurplusTime", "AucTimeStatus" }); return Success("成功:任务已暂停"); } //方法2 //var mark = Service.GetIQueryable ().FirstOrDefault(x => x.Id == MId); //if (mark == null) // return; ////获取实际结束时间。 //var subEndTime = mark.EndTime.Value; ////计算暂停后剩余的时间 = audEndTime(结束时间) - 当前时间 //var nowEndTime = DateTime.Now; //var DifferTime = subEndTime.Subtract(nowEndTime); ////追加 剩余时间 和 当前结束时间; //mark.SurplusTime = DifferTime.ToString(); ////mark.EndTime = nowEndTime; //Service.UpdateAny (mark, new List { "SurplusTime" }); ////拍卖进行中 //var GroupName = _options.GetPKById ("1316283839361847296").ToString(); ////关闭该定时器 //RemoveJob(mark.AuctionId, mark.Id, GroupName); } catch (Exception) { throw; } }
倒计时恢复:
俗话说得好破镜难圆,泼出去的水很难收回来。恢复也是这个道理,比如:倒计时走到了7暂停,那么恢复的时候如何从7继续呢。这里就牵扯到了时间戳并且存入数据库的介入了。
////// 恢复倒计时 /// public AjaxResult ReturnQz(string Id, string MId) { try { var mark = Service.GetIQueryable().FirstOrDefault(x => x.Id == MId); if (mark == null) return Error(); //获取实际结束时间。 if (mark.SurplusTime.IsNullOrEmpty()) { return Error(); } TimeSpan.TryParse(mark.SurplusTime, out TimeSpan surplusTime); //方法1 //拍卖进行中 //拍卖进行中 var GroupName = _options.GetPKById ("1316283839361847296").ToString(); var TriKey = new TriggerKey(GroupName + Id + MId + "t", GroupName); var Result = scheduler.GetTriggerState(TriKey).Result; if (Result == TriggerState.None) { return Error("失败:不存在此任务!"); } if (Result == TriggerState.Normal)//暂停 { return Error("失败:任务正在进行,无需恢复!"); } else { //结束时间 = 当前时间 + 剩余时间 var endTime = DateTime.Now.Add(surplusTime); //获取限时竞价时间 var LimitTime = endTime.AddHours(-mark.LimitHH.Value).AddMinutes(-mark.LimitMM.Value).AddSeconds(-mark.LimitSS.Value); //修改倒计时任务; UpdateQz(mark.AuctionId, mark.Id, endTime, LimitTime); //追加 剩余时间 和 当前结束时间; mark.SurplusTime = ""; mark.EndTime = endTime; var C1 = endTime.Subtract(DateTime.Now); var C2 = endTime.Subtract(LimitTime); if (C1 > C2) mark.AucTimeStatus = 0; else mark.AucTimeStatus = 1; Service.UpdateAny (mark, new List { "SurplusTime", "EndTime", "AucTimeStatus" }); return Success(); } //方法2 //var mark = Service.GetIQueryable ().FirstOrDefault(x => x.Id == MId); //if (mark == null) // return; ////获取实际结束时间。 //if (mark.SurplusTime.IsNullOrEmpty()) //{ // return; //} //TimeSpan.TryParse(mark.SurplusTime, out TimeSpan surplusTime); //TimeSpan a = new TimeSpan(1, 1, 1); ////结束时间 = 当前时间 + 剩余时间 //var endTime = DateTime.Now.Add(surplusTime); ////获取限时竞价时间 //var LimitTime = endTime.AddHours(-mark.LimitHH.Value).AddMinutes(-mark.LimitMM.Value).AddSeconds(-mark.LimitSS.Value); ////新增倒计时任务; //AddQz(mark.AuctionId, mark.Id, DateTime.Now, endTime, LimitTime); ////追加 剩余时间 和 当前结束时间; //mark.SurplusTime = ""; //mark.EndTime = endTime; //Service.UpdateAny (mark, new List { "SurplusTime", "EndTime" }); } catch (Exception ex) { throw; } }
到此,关于"C# Quartzs定时器的使用方法是什么"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
时间
任务
方法
倒计时
定时器
剩余
拍卖
使用方法
C#
实际
学习
组件
封装
两个
实例
数据
更多
帮助
推送
实用
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
与网络安全工程师相关的公司
软件开发版本更新类型
如何搭建缓存服务器
手机上怎么远程连接云服务器
手机数据库表
珠海有哪些互联网科技企业
科技领域 互联网 区块链
2018网络安全 题库
非关系数据库树结构
应该将实验数据库
医院在信息软件开发
软件开发有哪几种角色
大学生怎么处理网络安全问题
创建与管理www服务器
房山区数据网络技术咨询
怀旧服人物怎么转服务器
50岁还能做软件开发吗
远程桌面如何修改服务器id
计算机网络技术是不是网络工程
济宁管理软件开发哪家做的好
南京理工大学复试数据库原理
国家公共安全数据库
欢迎网络安全检查领导小组
网上订餐外卖数据库
数据库结果到html显示
深圳市火云间网络技术开发
软件开发毕业论文目录
苏宁服务器怎么租
互联网对科技产业政策
cosg官方服务器链接失败