C# MVC项目中添加定时器

有时候我们在项目中会需要添加一些定时器来定时执行某项操作,

一、采用 定时器 Timer。这种方法适合循环执行的方法,每隔一段时间执行一次

实际上这就是新开一个线程,在Global文件 中新写一个方法来声明这个定时器,然后在 Application_Start 中调用此方法。

Application_Start方法就是当程序被访问的时候会被调用,所以想要执行这些方法我们要确保程序没有被IIS关闭。

 System.Timers.Timer timer = new System.Timers.Timer(1200000);//执行时间间隔(毫秒)
            timer.AutoReset = true;(是否重复执行 Elapsed  事件)
            timer.Enabled = true;(是否引发 Elapsed 事件 )
            timer.Elapsed += new System.Timers.ElapsedEventHandler(删除预约中信息);要执行的方法

二、在程序里面新开一个Job,这种方法适合定点执行,在config文件设置好执行的时间

想要采用这种方法 先要在nuget管理器安装一个 Quartz 的 dll

创建一个 JobServer的类,创建一个作业

    public class JobServer<T> where T : IJob
    {
        public string JobName { get; set; }
        public string JobGroup { get; set; }

        public IJobDetail CrateJob()
        {
            IJobDetail job1 = JobBuilder.Create<T>() //创建一个作业
                .WithIdentity(JobName, JobGroup) //JobName  代表你要执行的这个任务的名称。 JobGroup任务分组
                .Build();
            return job1;
        }
    }

然后添加一个 JobBase 的类,做一些关于这个作业的配置

public class JobBase
    {
        public static IScheduler Scheduler
        {
            get
            {
                ///CrystalQuartzPanel.axd
                var properties = new NameValueCollection();
                // 设置线程池
                properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
                //设置线程池的最大线程数量
                properties["quartz.threadPool.threadCount"] = "5";
                //设置作业中每个线程的优先级
                properties["quartz.threadPool.threadPriority"] = ThreadPriority.Normal.ToString();
                // 远程输出配置
                properties["quartz.scheduler.exporter.type"] = "Quartz.Simpl.RemotingSchedulerExporter, Quartz";
                properties["quartz.scheduler.exporter.port"] = "1998";  //配置端口号
                properties["quartz.scheduler.exporter.bindName"] = "QuartzScheduler";
                properties["quartz.scheduler.exporter.channelType"] = "tcp"; //协议类型
                //创建一个工厂
                var schedulerFactory = new StdSchedulerFactory(properties);
                //启动
                var scheduler = schedulerFactory.GetScheduler();
                return scheduler;
            }
        }

        public static void AddSchedule<T>(JobServer<T> jobServer, ITrigger trigger, string jobName, string jobGroup) where T : IJob
        {
            jobServer.JobName = jobName;
            jobServer.JobGroup = jobGroup;
            Scheduler.ScheduleJob(jobServer.CrateJob(), trigger);
        }

    }

添加一个 JobManager 类,来开启调度

  public static void State()
        {
            ////开启调度
            JobBase.Scheduler.Start();
            ////自动清算
            JobBase.AddSchedule(new JobServer<AutomaticRenewalJob>(),
              new AutomaticRenewalTriggerServer().AutomaticRenewalTrigger(), "锁定期合同(优享期30天)自动解锁与自动续期", "消息工作");
        }
//其中 AutomaticRenewalJob是实际执行的一些方法,AutomaticRenewalTriggerServer是作业触发的一些配置

添加实际执行的方法和作业触发的一些配置

 //作业实际执行的方法集
 public class AutomaticRenewalJob : IJob
    {
        public void Execute(IJobExecutionContext context)
        {

            #region 日志
            var reportDirectory = string.Format("~/autologs/{0}/", DateTime.Now.ToString("yyyy-MM-dd"));
            reportDirectory = System.Web.Hosting.HostingEnvironment.MapPath(reportDirectory);
            if (!Directory.Exists(reportDirectory))
            {
                Directory.CreateDirectory(reportDirectory);
            }
            var dailyReportFullPath = string.Format("{0}text_{1}.log", reportDirectory, DateTime.Now.Day);
            #endregion

            #region 任务调度加入日志
            var logContent = string.Format("{0}-{1}{2}", DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "自动解锁与续期任务已执行", Environment.NewLine);
            File.AppendAllText(dailyReportFullPath, logContent);
            #endregion

    }

//作业启动的一些配置
 public class AutomaticRenewalTriggerServer
    {
        public ITrigger AutomaticRenewalTrigger()
        {
            var runtime = ConfigurationManager.AppSettings["UnlockRumTime"];
            var trigger = TriggerBuilder.Create()
                                     .WithIdentity("自动解锁与续期", "作业触发器")
                                     .StartNow()
                                     .WithCronSchedule(runtime)  //0点运行 
                                     .Build();
            return trigger;
        }
    }

    //0 0 12 * * ? 每天12点触发
    //0 15 10 ? **每天10点15分触发
    //0 15 10 * * ? 每天10点15分触发
    //0 15 10 * * ? *每天10点15分触发
    //0 15 10 * * ? 2005 2005年每天10点15分触发
    //0 * 14 * * ? 每天下午的 2点到2点59分每分触发
    //0 0 / 5 14 * * ? 每天下午的 2点到2点59分(整点开始,每隔5分触发)
    //0 0 / 5 14,18 * * ? 每天下午的 2点到2点59分(整点开始,每隔5分触发)
    //每天下午的 18点到18点59分(整点开始,每隔5分触发)
    //0 0 - 5 14 * * ? 每天下午的 2点到2点05分每分触发
    //0 10,44 14 ? 3 WED     3月分每周三下午的 2点10分和2点44分触发 (特殊情况,在一个时间设置里,执行两次或 两次以上的情况) 
    //0 59 2 ? *FRI    每周5凌晨2点59分触发; 
    //0 15 10 ? *MON - FRI 从周一到周五每天上午的10点15分触发
    //0 15 10 15 * ? 每月15号上午10点15分触发
    //0 15 10 L * ? 每月最后一天的10点15分触发
    //0 15 10 ? *6L 每月最后一周的星期五的10点15分触发
    //0 15 10 ? *6L 2002 - 2005 从2002年到2005年每月最后一周的星期五的10点15分触发
    //0 15 10 ? *6#3 每月的第三周的星期五开始触发 
    //0 0 12 1 / 5 * ? 每月的第一个中午开始每隔5天触发一次
    //0 11 11 11 11 ? 每年的11月11号 11点11分触发(光棍节)

然后在 Gloabl文件的 Application_Start 方法启动这个方法

另外需要在config做一些配置工作

//首先在 appSettings 
    <!--任务调度时间配置-->
    <add key="UnlockRumTime" value="0 47 17 * * ?" />

//  configSections里面
  <sectionGroup name="crystalQuartz" type="CrystalQuartz.Web.Configuration.CrystalQuartzConfigurationGroup">
			<section name="provider" type="CrystalQuartz.Web.Configuration.ProviderSectionHandler" requirePermission="false" allowDefinition="Everywhere" />
		</sectionGroup>

//
<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
  <handlers>
        <add name="CrystalQuartzPanel" verb="*" path="CrystalQuartzPanel.axd" type="CrystalQuartz.Web.PagesHandler, CrystalQuartz.Web" />
      </handlers>
  </system.webServer>

//runtime 里面
      <dependentAssembly>
        <assemblyIdentity name="Quartz" publicKeyToken="f6b8c98a402cc8a4" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.6.2.0" newVersion="2.6.2.0" />
      </dependentAssembly>

//configuration 里面     
<crystalQuartz>
    <provider>
      <add property="Type" value="CrystalQuartz.Core.SchedulerProviders.RemoteSchedulerProvider, CrystalQuartz.Core" />
      <!-- Edit scheduler host value below =================================== -->
      <add property="SchedulerHost" value="tcp://localhost:555/QuartzScheduler" />
      <!--                                 =================================== -->
    </provider>
	</crystalQuartz>

这样设置的是每天17点47分执行

发布了45 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_36730649/article/details/103014156