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

相对于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. C# Excel添加超链接

    操作当前单元格(关键代码就两行) Range range = (Range)ExSheet.Cells[i + 2, j + 1];                                   ...

  2. tanera笔记

    use bit operation int i = ...; if ((i & 0x4) != 0) { //倒数第三位是为1 } C++的友元类和友元函数实例 - winfu - 博客园 h ...

  3. Java中的包装数据类型

    基本类型 包装器类型 boolean Boolean char Character int Integer byte Byte short Short long Long float Float do ...

  4. 源码解析之AQS源码解析

    要理解Lock首先要理解AQS,而要理解并发类最好的方法是先理解其并发控制量不同值的含义以及该类运作流程,然后配合一步步看源码.该类有一个重要的控制量是WaitStates,节点的状态值. /** w ...

  5. es6之更优雅的条件语句

    在使用JavaScript时,条件判断是经常会用到的,一些简单的判断条件还可以接受,当遇到比较复杂多重条件时就比较恶心了.这里使用es6的小技巧使判断更优雅. 1.使用 Arrary.includes ...

  6. es6入门set和map

    ES6提供了新的数据结构Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set函数可以接受一个数组(或类似数组的对象)作为参数,用来初始化. var set = new Set([1, ...

  7. python中使用Opencv进行车牌号检测——2018.10.24

    初学Python.Opencv,想用它做个实例解决车牌号检测. 车牌号检测需要分为四个部分:1.车辆图像获取.2.车牌定位.3.车牌字符分割和4.车牌字符识别 在百度查到了车牌识别部分车牌定位和车牌字 ...

  8. Linux shell 信号继承

    shell中,向进程发送信号多多通过ctrl键加上一些功能键来实现,这里是常见的Ctrl组合键及其意义: 组合键 信号类型 意义 Ctrl+C INT信号,即interrupt信号 停止运行当前的作业 ...

  9. 大数据入门到精通9-真正得wordcount

    本章节实现一个真正得wordcount 得spark程序. 一.从本地获得一个数据集 val speechRdd= sc.parallelize(scala.io.Source.fromFile(&q ...

  10. lambda正则化参数的大小影响

    当lambda的值很小时,其惩罚项值不大,还是会出现过拟合现象,当时lambda的值逐渐调大的时候,过拟合现象的程度越来越低,但是当labmda的值超过一个阈值时,就会出现欠拟合现象,因为其惩罚项太大 ...