学更好的别人,
做更好的自己。
——《微卡智享》
本文长度为3404字,预计阅读9分钟
前言
上一篇《项目实战|C#Socket通讯方式改造(一)--Socket实现Ftp的上传和下载》我们简单介绍了项目的背景及需要实现新的方式时利用Socket针对Ftp服务器实现文件的上传和下载,因为方式由原来的实时通讯改为每天的定时通讯,所以我们这篇就来看一下怎么实现定时任务的使用。
项目分析
Quartz实现任务定时处理
微卡智享
其实要实现定时任务处理的方式有比较多的,如直接加一个Timer进行处理,或是做一个Windows服务等,我也是看了一些相关的文章,再做了一下对比后,决定使用Quartz框架的,主要是方便,也快速实现。
实现效果
代码实现
01
创建项目
我们的项目后台用的WebApi所以我们建的这个项目也是WebApi的项目,创建好后基本目录
02
安装Quartz框架
打开管理NuGet程序包,我们搜索Quartz,然后点击安装
因为当时给客户开发的时候用的是.netframework4.5,所以我就装了2.6.2的版本,3.0的版本后需要是.netframework4.5.2以上才可以。
03
生成文件的方法类(TaskDo)
代码语言:javascript复制using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
namespace QuartzDemo
{
/// <summary>
/// 处理做的事
/// </summary>
public class TaskDo
{
static string filePath = @"D:IISTest";
public static void CreateFile()
{
Random rd = new Random();
int count = rd.Next(0, 200);
//判断路径是否存在,不存在创建
if (!Directory.Exists(filePath))
{
Directory.CreateDirectory(filePath);
}
//将循环完后拼接好的字符串保存到txt文件里,文件名为用户控件名称
string filename = filePath "\file" count ".txt";
StringBuilder sb = new StringBuilder();
//写入数据
for (int i = 0; i < count; i)
{
sb.Append("data:" i "|" DateTime.Now.ToString());
}
File.WriteAllText(filename, sb.ToString(), Encoding.UTF8);
}
}
}
完成上面的后,我们就开始真正使用Quartz框架了
使用Quartz框架
01
创建任务
创建一个类继承自IJob的接口,然后实现接口中的Execute的方法
代码语言:javascript复制using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace QuartzDemo
{
/// <summary>
/// 创建QuartzJob的类继承IJOB的接口,在Execute中加入实现方法
/// </summary>
public class QuartzJob : IJob
{
public void Execute(IJobExecutionContext context)
{
//调用TaskDo下面的生成文件方法
TaskDo.CreateFile();
}
}
}
02
创建任务调度类
新建一个任务调度类,用于供外部调用。
代码语言:javascript复制using Quartz;
using Quartz.Impl;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace QuartzDemo
{
/// <summary>
/// 创建任务调度类
/// </summary>
public class QuartzJobScheduler
{
public static void Start()
{
//调度器工厂
ISchedulerFactory factory = new StdSchedulerFactory();
//调度器
IScheduler scheduler = factory.GetScheduler();
scheduler.GetJobGroupNames();
//计划任务代码实现
//1.创建任务,调用QuartzJob的类
IJobDetail detail = JobBuilder.Create<QuartzJob>().Build();
IJobDetail detail1 = JobBuilder.Create<ListenIISJob>().Build();
//2.创建触发器
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("Job", "Upload")
.WithSimpleSchedule(
t => t.WithIntervalInSeconds(60).RepeatForever())
.Build();
ITrigger trigger1 = TriggerBuilder.Create()
.WithIdentity("IIS", "ListenIIS")
.WithSimpleSchedule(
t => t.WithIntervalInMinutes(1).RepeatForever())
.Build();
//3.添加任务及触发器至调度中
scheduler.ScheduleJob(detail, trigger);
scheduler.ScheduleJob(detail1, trigger1);
//启动
scheduler.Start();
}
}
}
上面的触发器中WithIntervalInSeconds(60)就是设置的间隔时间60秒,这里可以看一下还有分钟,小时的参数,根据这个可以自己设定。
03
设置IIS启动时注册任务
在Global.asax的Application_Start()中加入
代码语言:javascript复制//注册定时任务
QuartzJobScheduler.Start();
这样我们的任务调用就可以完成了,效果如下
TIPS
IIS网站应用程序池中默认的闲置超时为20分钟,如果20分钟没有任务调用API,那我们做的Quartz任务也会被回收,不再启动,所有我们在Demo中又加了一个开启的任务,每隔多少时间调用一次网站,上图代码已经有了,这里把IIS的Job也列一下
代码语言:javascript复制using Quartz;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Web;
namespace QuartzDemo
{
public class ListenIISJob : IJob
{
public void Execute(IJobExecutionContext context)
{
try
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost:8080/");
HttpWebResponse rsp = (HttpWebResponse)req.GetResponse();
string desc = rsp.StatusDescription;
StringBuilder sb = new StringBuilder();
sb.Append("request" DateTime.Now.ToString() "rn");
string file = @"D:IISTestrequest.txt";
File.AppendAllText(file, sb.ToString(), Encoding.UTF8);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
完