返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#Quartzs定时器的使用教程
  • 644
分享到

C#Quartzs定时器的使用教程

2024-04-02 19:04:59 644人浏览 薄情痞子
摘要

目录前言实现步骤前言 首先想到倒计时,定时任务。大家想到的肯定就是定时器。那么定时器在WEB和winfrom程序中有着很大的作用。那在服务器端有没有像定时器一样的存在呢。 有了这些需

前言

首先想到倒计时,定时任务。大家想到的肯定就是定时器。那么定时器在WEB和winfrom程序中有着很大的作用。那在服务器端有没有像定时器一样的存在呢。

有了这些需求,我找到了第三方的组件 Quartz.net 来实现(源码位置)

实现步骤

(1)第一步,通过NuGet下载Quartz.Net组件并且引用到当前工程中

(2)创建两个类,一个是操作类,一个类继承IJob 并且需要实现IJob的方法。 


/// <summary>
    /// 操作类
    /// </summary>
    public class Operation : BaseBusiness<Auction>
    {

        #region 实例化

        public Operation()
        {
            _options = new Options();
        }

        internal IOptions _options { get; }

        #endregion

        public static IScheduler scheduler;
        public static ISchedulerFactory factory;
        /// <summary>
        /// 获取cron表达式
        /// </summary>
        /// <param name="time">时间</param>
        /// <returns></returns>
        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;
        }
        /// <summary>
        /// 删除job
        /// </summary>
        /// <param name="Id">拍卖数据对象主键</param>
        /// <param name="GroupName">job的组名</param>
        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


            });
        }


/// <summary>
        /// 设置定时任务
        /// </summary>
        /// <param name="Id">标的ID</param>
        public void AddQz(DateTime BeginTime, DateTime FreeTime)
        {

            var GroupName = _options.GetPKById<Options_AuctionState>("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<SetAuctionings>()
                       .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);
        }

    }

以上是一个简单的封装,可以根据这个倒计时的推送。增加一些封装 如:暂停,恢复,结束,更新等。

调用的话只需要简单的实例化一下进行调用。

然后我在大概说下其他封装的思路和代码片段;

延时倒计时:

根据传过来的参数时间进行一个修改,删除之前的任务重新开始一个任务;


/// <summary>
        /// 【拍卖延时】修改倒计时任务
        /// </summary>
        /// <param name="Id"></param>
        /// <param name="MeetingPlace"></param>
        /// <param name="FreeTime"></param>
        public void UpdateQz(String Id, string Mid, DateTime FreeTime, DateTime LimitTime)
        {
 
 
            //scheduler = factory.GetScheduler().Result;
            //if (scheduler == null)
            //    return;
 
            //拍卖进行中
            var GroupName = _options.GetPKById<Options_AuctionState>("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方法可以进行暂停;

/// <summary>
/// 倒计时暂停
/// </summary>
public ajaxResult StopQz(string Id, string MId)
{
    try
    {
 
 
 
        //方法1
        //拍卖进行中
        var GroupName = _options.GetPKById<Options_AuctionState>("1316283839361847296").ToString();
 
 
 
        var mark = Service.GetIQueryable<MarkGoods>().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<MarkGoods>(mark, new List<string> { "SurplusTime", "AucTimeStatus" });
            return Success("成功:任务已暂停");
        }
 
 
 
 
        //方法2
        //var mark = Service.GetIQueryable<MarkGoods>().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<MarkGoods>(mark, new List<string> { "SurplusTime" });
 
 
 
        ////拍卖进行中
        //var GroupName = _options.GetPKById<Options_AuctionState>("1316283839361847296").ToString();
        ////关闭该定时器
        //RemoveJob(mark.AuctionId, mark.Id, GroupName);
 
    }
    catch (Exception)
    {
 
        throw;
    }
 
 
}

倒计时恢复:

俗话说得好破镜难圆,泼出去的水很难收回来。恢复也是这个道理,比如:倒计时走到了7暂停,那么恢复的时候如何从7继续呢。这里就牵扯到了时间戳并且存入数据库的介入了。


/// <summary>
        /// 恢复倒计时
        /// </summary>
        public AjaxResult ReturnQz(string Id, string MId)
        {
            try
            {


                var mark = Service.GetIQueryable<MarkGoods>().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<Options_AuctionState>("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<MarkGoods>(mark, new List<string> { "SurplusTime", "EndTime", "AucTimeStatus" });

                    return Success();


                }








                //方法2
                //var mark = Service.GetIQueryable<MarkGoods>().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<MarkGoods>(mark, new List<string> { "SurplusTime", "EndTime" });


            }
            catch (Exception ex)
            {

                throw;
            }

        }

以上代码均是提供思路,使用时需要进行代码简单改动。 

以上就是C# Quartzs定时器的使用教程的详细内容,更多关于C# Quartzs定时器的资料请关注编程网其它相关文章!

--结束END--

本文标题: C#Quartzs定时器的使用教程

本文链接: https://lsjlt.com/news/158833.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C#Quartzs定时器的使用教程
    目录前言实现步骤前言 首先想到倒计时,定时任务。大家想到的肯定就是定时器。那么定时器在web和winfrom程序中有着很大的作用。那在服务器端有没有像定时器一样的存在呢。 有了这些需...
    99+
    2024-04-02
  • C# Quartzs定时器的使用方法是什么
    这篇文章主要介绍“C# Quartzs定时器的使用方法是什么”,在日常操作中,相信很多人在C# Quartzs定时器的使用方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#&nb...
    99+
    2023-06-21
  • linux定时器crontab的使用教程
    编辑:crontab –u root –e 列表:crontab –u root –l 删除:crontab –u root –r 每五分钟执行  */5 * * * * 每小时执行  &n...
    99+
    2022-06-04
    linux 定时器 crontab linux crontab
  • c#线程定时器System.Threading.Timer的使用
    System.Threading.Timer 是由线程池调用的。 所有的Timer对象只使用了一个线程来管理。这个线程知道下一个Timer对象在什么时候到期。下一个Timer对象到期...
    99+
    2023-02-06
    c# 线程定时器 System.Threading.Timer c# 线程定时器 c# System.Threading.Timer
  • C# 索引器的使用教程
    目录概述语法索引器(Indexer)的用途重载索引器(Indexer)概述 索引器(Indexer) 允许一个对象可以像数组一样使用下标的方式来访问。 当您为类定义一个索引器时,该类...
    99+
    2024-04-02
  • python定时任务apscheduler的详细使用教程
    目录前言安装主要组成部分简单应用完整代码总结前言 我们项目中总是避免不了要使用一些定时任务,比如说最近的项目,用户点击报名考试以后需要在考试日期临近的时候推送小程序消息提醒到客户微信...
    99+
    2024-04-02
  • C#中Timer定时器类的简单使用
    目录System.Timers.Timer定时器简单使用设置初始属性简单示例–借用官方示例System.Timers.Timer 定时器就是经过固定时间,执行固定任务。 ...
    99+
    2024-04-02
  • C#中的Timer定时器类如何使用
    本文小编为大家详细介绍“C#中的Timer定时器类如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#中的Timer定时器类如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。System.Timers...
    99+
    2023-06-30
  • C#中Dapper的使用教程
    一、什么是Dapper   Dapper是一款轻量级ORM工具(Github)。如果你在小的项目中,使用Entity Framework、NHibernate 来处理大数据访问及关系...
    99+
    2024-04-02
  • Android入门之计时器Chronometer的使用教程
    目录介绍课程目标界面端代码后端交互代码运行效果介绍 非常简单的一个计时器,没有太多原理,我们直接上代码。 先看课程目标 课程目标 就是一个简单的计时器,我们直接上使用示例吧 界面里...
    99+
    2022-11-16
    Android计时器Chronometer使用 Android计时器Chronometer Android Chronometer Android计时器
  • Nodejs极简入门教程(二):定时器
    setTimeout 和 clearTimeout var obj = setTimeout(cb, ms); setTimeout 用于设置一个回调函数 cb,其在最少 ms 毫秒后被执行(并非在 m...
    99+
    2022-06-04
    定时器 入门教程 Nodejs
  • Python-定时器使用
    背景: 定时器方式触发python脚本 采用python内部的timer 方式1: # -*- coding: utf-8 -*- __author__ = 'jason' from threading import Timer ...
    99+
    2023-01-31
    定时器 Python
  • Spring 定时器使用
    Quartz是一个强大的企业级任务调度框架,Spring中继承并简化了Quartz,下面就看看在Spring中怎样配置Quartz:首先我们来写一个被调度的类: package com.kay.quartz;publicclass Quar...
    99+
    2023-06-03
  • mysql的定时任务实例教程
    前言 自 MySQL5.1.6起,增加了一个非常有特色的功能–事件调度器(Event Scheduler),可以用做定时执行某些特定任务(例如:删除记录、对数据进行汇总等等),来取代原先只能由操作系统的计划...
    99+
    2024-04-02
  • C#中类的使用教程详解
    目录实例化类成员访问赋值方法方法调用方法重载在对类访问使用时,常用到的有访问类的成员、方法。 实例化 在对类进行访问时,需要将类进行实例化。并产生一个对象。可以使用关键字new来实现...
    99+
    2024-04-02
  • C# Chart 简单使用教程
    Chart控件可以用来绘制波形图、柱状图、饼图、折线图等,用来进行数据表现是很不错的,现在简单说一下这个控件的使用方法 XAML: <Window x:Class="WpfA...
    99+
    2022-11-21
    C# Chart使用 C# Chart
  • Golangcron定时器和定时任务的使用场景
    目录Golang cron 定时器和定时任务timer和ticker的区别TimerTickercron 定时任务参考链接:Golang cron 定时器和定时任务 Golang中t...
    99+
    2024-04-02
  • linux多线程定时器如何使用
    在Linux上使用多线程定时器,可以使用以下步骤:1. 包含必要的头文件:```c#include #include #includ...
    99+
    2023-10-09
    linux
  • 微信小程序setInterval定时函数新手使用的超详细教程
    目录1、setInterval的理解2、setInterval放在微信小程序onshow函数里3、setInterval具体使用4、离开当前页面关闭 setInterval定时函数附...
    99+
    2022-11-13
    微信小程序setinterval用法 小程序的setdate方法 js定时器setinterval
  • Jmeter固定定时器的使用详解
    目录场景举例特殊说明特殊说明补充:统一随机定时器准确的吞吐量定时器常数吞吐量定时器Jmeter之固定定时器的使用 Jmeter的线程组在发送2个请求之间需要设置一个等待时间时,可以用...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作