1、说明
本文为任务计划程序提供解决方案,倘若你需要程序机械式、定时性、周期性执行某项任务,本文兴许可以帮到你。
任务计划,采用Quartz、Cron表达式技术开发,如果对其中知识点不清楚的地方,可以自行查阅资料,本文将教会你如何快速实用他们,真的很简单,本文已经对实现类进行封装,你只需要写几行调用代码。
2、引入组件
Quartz.dll 唯一需要引入的组件,网上可以找到它
3、封装代码
①抽象类JobBase.cs
///
/// 抽象类,之后所有job继承这个基类,实现run方法
///
public abstract class JobBase
{
//抽象类,必须有一个抽象方法
public abstract void Run(string FullFileName);
}
②定义接口实例 JobInstance.cs,并实现IJob接口。
/ //@DisallowConcurrentExecution //禁止并发多任务执行,所以永远只有一个任务在执行中
public class JobInstance : IJob
{
///
/// 该类实现Ijob接口
/// 从jobDataMap中取出JobBase实体,并执行Run方法
///
///
///
public Task Execute(IJobExecutionContext context)
{
IDictionary
if (jobs != null)
{
foreach (var item in jobs)
{
return Task.Run(() =>
{
try
{
JobBase jobObj = item.Value as JobBase;//不在这里拆分
string l_strFilename = item.Key;
jobObj.Run(l_strFilename);
}
catch (Exception ex)
{
//throw Exception();
throw;
}
});
}
}
return new Task(null);
}
}
③任务管理类JobManager.cs,负责任务的添加、删除、暂停、恢复,实际用于实用的就是该类中的方法。
public class JobManager
{
IScheduler scheduler;
public JobManager()
{
scheduler = StdSchedulerFactory.GetDefaultScheduler().Result;
scheduler.Start();
}
///
/// 添加任务(传入时间间隔)
///
///
/// 时间间隔
public void AddJob
{
JobBase jbobj = Activator.CreateInstance
IDictionary
jobData.Add("name", jbobj);
IJobDetail job1 = JobBuilder.Create
.SetJobData(new JobDataMap(jobData)).Build();
ITrigger trigger1 = TriggerBuilder.Create()
.StartNow()
.WithSimpleSchedule(x => x.WithIntervalInSeconds(Second)
.RepeatForever()).Build();
scheduler.ScheduleJob(job1, trigger1);
}
///
/// 添加任务
///
///
/// 任务名
/// 执行时间策略
public void AddJob
{
JobBase jbInstance = Activator.CreateInstance
IDictionary
jobData.Add(filename, jbInstance);//键值对,存在key里可以找到文件名
IJobDetail job1 = JobBuilder.Create
.SetJobData(new JobDataMap(jobData)).WithIdentity(filename).Build();//WithIdentity()指定任务名,用于其后关闭
ITrigger trigger1 = TriggerBuilder.Create()
.StartNow()
.WithCronSchedule(rule).Build();
scheduler.ScheduleJob(job1, trigger1);
}
///
/// 删除任务
///
///
/// 任务名
public void DelJob
{
JobKey jobKey = new JobKey(jbname);
if (scheduler != null && scheduler.CheckExists(jobKey).Result)
{
scheduler.DeleteJob(jobKey);
}
}
///
/// 暂停任务
///
///
/// 任务名
public void PauseJob
{
JobKey jobKey = new JobKey(jbname);
if (scheduler != null && scheduler.CheckExists(jobKey).Result)
{
scheduler.PauseJob(jobKey);
}
}
///
/// 恢复任务
///
///
/// 任务名
public void ResumeJob
{
JobKey jobKey = new JobKey(jbname);
if (scheduler != null && scheduler.CheckExists(jobKey).Result)
{
scheduler.ResumeJob(jobKey);
}
}
④调用方式,案例
JobManager job = new JobManager(); //实例化
job.AddJob
很简单吧,就这两行代码就可以实现定时任务的调用了。以下为调用方法实现,需要重写Run方法,打开视频播放。
public class MediaJob : JobBase
{
///
/// 设定的时间执行这个方法
///
///
public override void Run(string fileName)
{
LogHelper.Info("进入Run方法执行:" + fileName);
ProcessExec processExec = new ProcessExec();
string l_strFullFileName = Path.Combine(SysParameter.res_path, fileName);
string l_strMess = "";
processExec.p_PPTClose(null,null);
LogHelper.Info("p_PPTClose()方法执行完毕:" + fileName);
processExec.MediaStart(l_strFullFileName, out l_strMess);
LogHelper.Info("MediaStart()方法执行完毕:" + fileName);
if (l_strMess.Length>0)
{
DataOperation.UpdateLastResult(fileName,l_strMess);
LogHelper.Info("UpdateLastResult()方法执行完毕:" + fileName);
}
else
{
DataOperation.UpdateLastResult(fileName, "成功");
LogHelper.Info("UpdateLastResult()方法执行完毕:" + fileName);
}
}
}
我也写了一个任务计划程序,运行效果如下图,需要源码的可以联系我。