老规矩:先把全部源码上传,见本文底部。

相对于Demo3的区别,就是能自动加载继承了IJob的任务,任务主体程序分离。

在exe执行文件的同级下建一个MyJobs的文件夹,每次会自动扫描该文件夹下的Job,添加到系统中来。

举例如下:现在有两个在系统中的任务。

复制一个编译好的Job dll文件放在MyJobs  按下工具菜单栏中的扫描,会有一个新增的任务出现。(是不影响其它正在执行的任务哦)

好了,图贴完,现在将下面几个技术要点。

1. 动态加载dll

IRun getRun;

        public void NewRun<T>() where T:IJob
{
getRun = new SimpleRunner<T>();
}
try
{
string dir = System.AppDomain.CurrentDomain.BaseDirectory + "MyJobs";
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
} DirectoryInfo TheFolder = new DirectoryInfo(dir);
foreach (FileInfo fi in TheFolder.GetFiles())//遍历文件夹下所有文件
{
string extension = Path.GetExtension(fi.FullName);//扩展名 ".aspx"
if (extension == ".dll")
{
#region 获取jobs
string path = fi.FullName;//dir + "\\Wpf.Quart.MyJobs.dll";
Assembly asm = Assembly.LoadFile(path); //Assembly asm = Assembly.GetExecutingAssembly();
Type[] types = asm.GetTypes(); foreach (Type t in types)
{
if (new ArrayList(t.GetInterfaces()).Contains(typeof(IJob)))
{
IJob job = ObjectUtils.InstantiateType<IJob>(t);
if (job != null)
{
MethodInfo mi = this.GetType().GetMethod("NewRun").MakeGenericMethod(new Type[] { t });
mi.Invoke(this, null); IRun run = getRun;
if (TaskRuns.Where(p => p.GetType() == run.GetType()).Count() > )
{
continue;
} if (run != null)
{
if (localRuns != null)
{
var localRun = localRuns.Where(p => p.Name == run.Name).FirstOrDefault();
if (localRun != null)
{
CopyHelper.LeftCopyRight(run, localRun);
}
}
if (run.TriggerState != TriggerState.Normal || run.Mode == Mode.Hand)
{
run.TriggerState = TriggerState.None;
}
run.CronSecondSet.Init();
run.CronMinuteSet.Init();
run.CronHourSet.Init();
run.CronDaySet.Init();
run.CronMonthSet.Init();
run.CronWeekSet.Init();
run.CronYearSet.Init();
run.LogOut = this.LogOut;
run.IsEdit = false;
TaskRuns.Add(run);
}
}
}
}
#endregion
}
}
}
catch (Exception ex)
{
log.Fatal(ex);
}

二.分离出几个关键的接口放到另一个库中,需要实现的任务加载那个dll库就行。主要用来显示的,如果你的任务不用显示,那么可以不需要这几个接口,直接继承IJob就行

public class JobHelper
{
public static IJobRun GetRun(IJobExecutionContext context)
{
JobDataMap data = context.JobDetail.JobDataMap; IJobRun Run = data.Get("Runner") as IJobRun;
if (Run != null)
{
Run.GetNextRunTimes();
}
return Run;
}
}

JobHelper

 public interface IJobRun
{
string CronExpression { get; set; }
TriggerState TriggerState { get; set; }
string SettingStr { get; set; }
DateTime? StartTime { get; set; }
DateTime? EndTime { get; set; }
DateTime? NextRunTime { get; }
DateTime[] NextRunTimes { get; set; }
void GetNextRunTimes();
void Info(string message);
void DEBUG(string message);
void ERROR(string message);
void FATAL(string message);
void WARN(string message);
}

IJobRun

三.具体任务的简单例子

public class MyHelloJobEx : IJob
{
public async Task Execute(IJobExecutionContext context)
{
await Console.Out.WriteLineAsync("HelloJob is executing.");
var Run = JobHelper.GetRun(context);
if (Run != null)
{
Run.Info("HelloJob is executing.");
}
}
} //JobHelper主要是来界面显示日志,获取下次任务执行时间。不需要,可以不用。

最后补充一下,水平不足,有点乱,抱歉。

源码下载地址:链接:https://pan.baidu.com/s/15UD5oMia8REnYVtJE4_xHA
提取码:pexq

定时任务 Wpf.Quartz.Demo.5 (升级版)的更多相关文章

  1. 定时任务 Wpf.Quartz.Demo.4

    本文继续介绍定时任务 Wpf.Quartz.Demo.3的一些小细节, 代码也请前往第3节下载. 1.RichTextBox右键菜单 <RichTextBox.ContextMenu>   ...

  2. 定时任务 Wpf.Quartz.Demo.2

    定时任务 Wpf.Quartz.Demo.1已经能运行了,本节开始用wpf搭界面. 准备工作: 1.界面选择MahApp.Metro 在App.xaml添加资源 <Application.Res ...

  3. 定时任务 Wpf.Quartz.Demo.1

    Quartz 是个开源的作业调度框架. 安装:Install-Package Quartz 官网文档地址:https://www.quartz-scheduler.net/documentation/ ...

  4. 定时任务 Wpf.Quartz.Demo.3

    先把全部源码上传,只是一个Demo,希望大家指点一下不足之处,见本文底部. 1.设置界面 2.详情页面 好了,现在慢慢叙述里面的一些方法. 3.实现拷贝的方法: (1) public static v ...

  5. [转][JAVA]定时任务之-Quartz使用篇

    [BAT][JAVA]定时任务之-Quartz使用篇 定时任务之-Quartz使用篇 Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与 ...

  6. Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置

    Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置 >>>>>>>>>>>>&g ...

  7. 震惊!Windows Service服务和定时任务框架quartz之间原来是这种关系……

    过场CG:   接到公司领导的文件指示,“小熊”需要在6月底去海外执行一个行动代号为[定时任务]的营救计划,这个计划关系到公司某个项目的生死(数据安全漏洞),作战部拟定两个作战方案: 方案一:使用务定 ...

  8. SpringBoot定时任务 - 集成quartz实现定时任务(单实例和分布式两种方式)

    最为常用定时任务框架是Quartz,并且Spring也集成了Quartz的框架,Quartz不仅支持单实例方式还支持分布式方式.本文主要介绍Quartz,基础的Quartz的集成案例本,以及实现基于数 ...

  9. Spring 整合 Quartz 实现动态定时任务(附demo)

    最近项目中需要用到定时任务的功能,虽然Spring 也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大.在考虑之后,决定整合更为专业的Quartz来实现定时任务功能. 普通定时任务 首先 ...

随机推荐

  1. tomcat JRE_HOME

    tomcat 不知道什么时候开始需要  JRE_HOME了: D:\java\apache-tomcat-7.0.68\bin>startup.batJAVA_HOME == D:\Progra ...

  2. kettle实现同构单表增量同步

    job如下: 如下转换:获取区服列表,将id列表保存到结果(内存) job: 同构数据库单表抽取(每个输入执行一次) 同构数据库单表抽取(job) 的具体实现如下: 转换:获取数据库连接ID 从结果获 ...

  3. tp5文件上传展示

    //接收文件 $file = request()->file('image'); //将文件移动到框架应用根目录/public/uploads/ 目录下 $info = $file->mo ...

  4. JSON数据的解析和生成(C++)

    安装 "JSON for Modern C++" $ brew tap nlohmann/json $ brew install nlohmann_json 安装之后将/usr/l ...

  5. MySQL中的sort_buffer_size参数大小的设置问题

    看到sort_buffer_size这个参数(connect级别的参数,MySQL5.7,默认值是1048576字节,也就是1MB)的默认值这么小,想着是不是可以调大一点,反正内存动不动几十个GB的, ...

  6. inline、block与inline-block

    参考了一些资料集其他人的博客,梳理一下inline.block与inline-block三个概念.     高度 宽度 举例 block 在新行上开始 高度,行高以及顶和底边距都可控制 宽度缺省是它的 ...

  7. (八)lambda、列表生成式、字典转list排序

    1.函数返回多个值: 1)函数如果return多个值的话,会把返回的这几个值放在一个元组里面 def say(): num1 = 1 num2 = 2 num3 = 3 return num1,num ...

  8. 配置Java运行环境

    变量名:JAVA_HOME    变量值:D:\Program Files\Java\jdk1.8.0_151(java安装目录) 变量名:Path                  变量值:.;%J ...

  9. java十进制转换成二进制数

    牢记这些呀,特别常用! 1.十进制转成二进制 String s = Integer.toBinaryString(n)  //将十进制数转成字符串,例如n=5 ,s = "101" ...

  10. 【转】GT 的性能测试方案解析

    前言 本文将整理腾讯GT各个性能测试项的测试方法,目的是为了帮助移动性能专项测试同学快速过一遍腾讯GT各个性能数据是如何获取的.另外对腾讯GT还不了解或者不知道它能做什么的同学可以看看这篇文章:htt ...