zoukankan      html  css  js  c++  java
  • C# 实现定时/循环任务

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

    要实现定时/循环任务,就需要用到C#的作业和触发器

    作业:

    1.作业创建:

    JobBuilder.Create<TestJob>()  这里的<TestJob>就是你实现具体任务的类
    1             IJobDetail job1 = JobBuilder.Create<TestJob>()
    2              .WithIdentity(jobName, gropName) //为该job的jobName和gropName赋值,相当于给予一个身份(非必须)
    3              .UsingJobData("key", "value")//为作业的具体任务传递参数,键值对(非必须)
    4              .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)     //触发时间,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 规则

  • 相关阅读:
    linux下安装字体解决爬虫截图乱码问题
    开线程爬取黑猫里的阿里投诉信息
    CSS以及JS各种库的在线CDN引用地址
    linux系统下安装PHP扩展pcntl
    linux系统下安装Git
    linux进行文件vim编辑时没有退出文件直接关闭出现E325: ATTENTION Found a swap file by the name "/usr/local/php/etc/.php.ini.swp"
    windows安装redis和PHP redis扩展
    找回phpstorm删除文件/文件夹(phpstorm删除文件/文件夹的恢复)
    YII报错笔记:<pre>PHP Notice &#039;yiiaseErrorException&#039; with message &#039;Uninitialized string offset: 0&#039; in /my/test/project/iot/vendor/yiisoft/yii2/base/Model.php:778
    linux下使用svn创建版本库和权限管理
  • 原文地址:https://www.cnblogs.com/jbdxbl/p/10598853.html
Copyright © 2011-2022 走看看