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

相对于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. 清除eclipse,STS workspace历史记录

    记一下 打开eclipse下的/configuration/.settings目录 修改文件org.eclipse.ui.ide.prefs文件 把RECENT_WORKSPACES这项修改为你需要的 ...

  2. Jmeter正则表达式提取器(转载)

    转载自 http://blog.csdn.net/qq_35885203 使用jmeter来测试时,经常会碰到需要上下文传输数据的情况,如登录后生成的token,在其他页面的操作,都需传入这个toke ...

  3. jQuery.ajax()调用asp.net后台方法(非常重要)

    http://www.cnblogs.com/zxhoo/archive/2011/01/30/1947752.html 用JQuery的$.ajax()可以很方便的调用asp.net的后台方法. 先 ...

  4. JRebel 代理激活

    1.生成GUID   https://www.guidgen.com/ 例:04cfff79-8f45-481c-a858-a5b9590422e7 2.License Server 例: http: ...

  5. sys模块的介绍

    sys.argv           命令行参数List,第一个元素是程序本身路径 sys.exit(n)        退出程序,正常退出时exit(0) sys.version        获取 ...

  6. linux学习资料收藏

      http://blog.chinaunix.net/uid/10167808/abstract/1.html?year=2008     http://linux.linuxidc.com/ind ...

  7. typedef typename

    所以根据上述两条分析,  typedef typename RefBase::weakref_type weakref_type; 语句的真是面目是: typedef创建了存在类型的别名,而typen ...

  8. [Ting's笔记Day7]活用套件carrierwave gem:(2)利用Amazon S3架设图片服务器

    来到第7篇了!培养写作习惯真是不容易:) 在我的上一篇文章活用套件carrierwave gem:(1)在Rails实现图片上传功能,上传图片功能已经完成啦!但是目前图片仅能上传在自己的本地文件夹内孤 ...

  9. CSS 图像大小

    CSS 图像大小 虽然在HTML中,img标签有属性height.width设置高和宽,在工作中却使用得非常少,通常使用CSS来控制大小. 给盒子设置属性height.width限制大小.单位通常是像 ...

  10. php 计算 距离

    function getdistance($lng1,$lat1,$lng2,$lat2){ //将角度转为狐度 $radLat1=deg2rad($lat1);//deg2rad()函数将角度转换为 ...