工作中需要做个每天定时发邮件的功能,了解之后知道java里有做定时任务比较容易的方法,就是Quartz,在C#里叫Quartz.Net。

在写代码之前需要引用几个dll文件,分别是C5.dll、Common.Logging.dll和Quartz.dll;还有一个QuartzManager.cs文件,直接复制到项目中

QuartzManager.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using Quartz;
using Quartz.Impl;
using Quartz.Impl.Triggers; namespace Quartz
{
public static class QuartzManager
{
private static ISchedulerFactory sf = null;
private static IScheduler sched = null; static QuartzManager()
{
sf = new StdSchedulerFactory();
sched = sf.GetScheduler();
sched.Start();
} /// <summary>
/// 添加Job 并且以定点的形式运行
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="JobName"></param>
/// <param name="CronTime"></param>
/// <param name="jobDataMap"></param>
/// <returns></returns>
public static DateTimeOffset AddJob<T>(string JobName, string CronTime, string jobData) where T : IJob
{
IJobDetail jobCheck = JobBuilder.Create<T>().WithIdentity(JobName, JobName + "_Group").UsingJobData("jobData", jobData).Build();
ICronTrigger CronTrigger = new CronTriggerImpl(JobName + "_CronTrigger", JobName + "_TriggerGroup", CronTime);
return sched.ScheduleJob(jobCheck, CronTrigger);
} /// <summary>
/// 添加Job 并且以定点的形式运行
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="JobName"></param>
/// <param name="CronTime"></param>
/// <returns></returns>
public static DateTimeOffset AddJob<T>(string JobName, string CronTime) where T : IJob
{
return AddJob<T>(JobName, CronTime, null);
} /// <summary>
/// 添加Job 并且以周期的形式运行
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="JobName"></param>
/// <param name="SimpleTime">毫秒数</param>
/// <returns></returns>
public static DateTimeOffset AddJob<T>(string JobName, int SimpleTime) where T : IJob
{
return AddJob<T>(JobName, DateTime.UtcNow.AddMilliseconds(), TimeSpan.FromMilliseconds(SimpleTime));
} /// <summary>
/// 添加Job 并且以周期的形式运行
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="JobName"></param>
/// <param name="SimpleTime">毫秒数</param>
/// <returns></returns>
public static DateTimeOffset AddJob<T>(string JobName, DateTimeOffset StartTime, int SimpleTime) where T : IJob
{
return AddJob<T>(JobName, StartTime, TimeSpan.FromMilliseconds(SimpleTime));
} /// <summary>
/// 添加Job 并且以周期的形式运行
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="JobName"></param>
/// <param name="SimpleTime"></param>
/// <returns></returns>
public static DateTimeOffset AddJob<T>(string JobName, DateTimeOffset StartTime, TimeSpan SimpleTime) where T : IJob
{
return AddJob<T>(JobName, StartTime, SimpleTime, new Dictionary<string, object>());
} /// <summary>
/// 添加Job 并且以周期的形式运行
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="JobName"></param>
/// <param name="StartTime"></param>
/// <param name="SimpleTime">毫秒数</param>
/// <param name="jobDataMap"></param>
/// <returns></returns>
public static DateTimeOffset AddJob<T>(string JobName, DateTimeOffset StartTime, int SimpleTime, string MapKey, object MapValue) where T : IJob
{
Dictionary<string, object> map = new Dictionary<string, object>();
map.Add(MapKey, MapValue);
return AddJob<T>(JobName, StartTime, TimeSpan.FromMilliseconds(SimpleTime), map);
} /// <summary>
/// 添加Job 并且以周期的形式运行
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="JobName"></param>
/// <param name="StartTime"></param>
/// <param name="SimpleTime"></param>
/// <param name="jobDataMap"></param>
/// <returns></returns>
public static DateTimeOffset AddJob<T>(string JobName, DateTimeOffset StartTime, TimeSpan SimpleTime, Dictionary<string, object> map) where T : IJob
{
IJobDetail jobCheck = JobBuilder.Create<T>().WithIdentity(JobName, JobName + "_Group").Build();
jobCheck.JobDataMap.PutAll(map);
ISimpleTrigger triggerCheck = new SimpleTriggerImpl(JobName + "_SimpleTrigger", JobName + "_TriggerGroup",
StartTime,
null,
SimpleTriggerImpl.RepeatIndefinitely,
SimpleTime);
return sched.ScheduleJob(jobCheck, triggerCheck);
} /// <summary>
/// 修改触发器时间,需要job名,以及修改结果
/// CronTriggerImpl类型触发器
/// </summary>
public static void UpdateTime(string jobName, string CronTime)
{
TriggerKey TKey = new TriggerKey(jobName + "_CronTrigger", jobName + "_TriggerGroup");
CronTriggerImpl cti = sched.GetTrigger(TKey) as CronTriggerImpl;
cti.CronExpression = new CronExpression(CronTime);
sched.RescheduleJob(TKey, cti);
} /// <summary>
/// 修改触发器时间,需要job名,以及修改结果
/// SimpleTriggerImpl类型触发器
/// </summary>
/// <param name="jobName"></param>
/// <param name="SimpleTime">分钟数</param>
public static void UpdateTime(string jobName, int SimpleTime)
{
UpdateTime(jobName, TimeSpan.FromMinutes(SimpleTime));
} /// <summary>
/// 修改触发器时间,需要job名,以及修改结果
/// SimpleTriggerImpl类型触发器
/// </summary>
public static void UpdateTime(string jobName, TimeSpan SimpleTime)
{
TriggerKey TKey = new TriggerKey(jobName + "_SimpleTrigger", jobName + "_TriggerGroup");
SimpleTriggerImpl sti = sched.GetTrigger(TKey) as SimpleTriggerImpl;
sti.RepeatInterval = SimpleTime;
sched.RescheduleJob(TKey, sti);
} /// <summary>
/// 暂停所有Job
/// 暂停功能Quartz提供有很多,以后可扩充
/// </summary>
public static void PauseAll()
{
sched.PauseAll();
} /// <summary>
/// 恢复所有Job
/// 恢复功能Quartz提供有很多,以后可扩充
/// </summary>
public static void ResumeAll()
{
sched.ResumeAll();
} /// <summary>
/// 删除Job
/// 删除功能Quartz提供有很多,以后可扩充
/// </summary>
/// <param name="JobName"></param>
public static void DeleteJob(string JobName)
{
JobKey jk = new JobKey(JobName, JobName + "_Group");
sched.DeleteJob(jk);
} /// <summary>
/// 卸载定时器
/// </summary>
/// <param name="waitForJobsToComplete">是否等待job执行完成</param>
public static void Shutdown(bool waitForJobsToComplete)
{
sched.Shutdown(waitForJobsToComplete);
}
}
}

窗体界面上只有一个Button按钮,点击之后将当前Windows窗体关闭,而我的定时任务就是实现这个关闭。

.closeForm();关闭窗体方法在另写的一个stopjob.cs类文件调用 这个类需要继承IJob

using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace winform状态栏
{
[PersistJobDataAfterExecution]
[DisallowConcurrentExecution]
public class stopjob : IJob
{
public void Execute(IJobExecutionContext context)
{
Program.form.closeForm();
}
}
}

上面代码中,Program.form并不是开始创建的那个窗体,而是在Program类文件中创建的静态Form。为什么另创建一个静态Form?涉及到子线程关闭主线程问题

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms; namespace winform状态栏
{
static class Program
{ public static Form1 form;
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
form = new Form1();
Application.Run(form);
}
}
}

Form.cs文件里引用Quartz(using Quartz;)

然后是关闭按钮(Button)的事件

using Quartz;
using System;
using System.Text.RegularExpressions;
using System.Windows.Forms; namespace winform状态栏
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button_close(object sender, EventArgs e)
{
//cron表达式 参考 http://www.cnblogs.com/sunjie9606/archive/2012/03/15/2397626.html
QuartzManager.AddJob<stopjob>("每隔5秒", "*/5 * * * * ?");//每隔5秒执行一次这个方法
} private delegate void CloseForm();//设计到多线程,子线程去控制主线程的控件,InvokeRequired值为true,用到定义委托,使得这个控制行为成为主线程的行为 public void closeForm()
{
if (this.InvokeRequired)
{
this.BeginInvoke(new CloseForm(closeForm));
}
else
{
this.Close();
}
}
}
}

关于执行stopjob的时间,我这里是用的每隔5秒执行一次,具体的解释在另一位博主那里有介绍

http://www.cnblogs.com/sunjie9606/archive/2012/03/15/2397626.html

其中C5.dll、Common.Logging.dll、Quartz.dll文件的链接http://pan.baidu.com/s/1hsBn1Bm(如果失效联系博主)

我学习Quartz.Net时用的是winform,大家可以试试别的,这样关于线程的问题应该就可以避免,这也是我没有想到的问题

C# 定时任务的更多相关文章

  1. Java定时任务的常用实现

    Java的定时任务有以下几种常用的实现方式: 1)Timer 2)ScheduledThreadPoolExecutor 3)Spring中集成Cron Quartz 接下来依次介绍这几类具体实现的方 ...

  2. [转]Java实现定时任务的三种方法

    在应用里经常都有用到在后台跑定时任务的需求.举个例子,比如需要在服务后台跑一个定时任务来进行非实时计算,清除临时数据.文件等.在本文里,我会给大家介绍3种不同的实现方法: 普通thread实现 Tim ...

  3. 使用python crontab设置linux定时任务

    熟悉linux的朋友应该知道在linux中可以使用crontab设置定时任务.可以通过命令crontab -e编写任务.当然也可以直接写配置文件设置任务. 但是有时候希望通过脚本自动设置,比如我们应用 ...

  4. C#定时任务组件之FluentScheduler

    FluentScheduler是.NET开源处理定时任务组件 1.任务的创建注册 public static void TaskActionByMinutes(Action action, int c ...

  5. 浅谈 linux 例行性工作 crontab (linux定时任务)

    定时任务大家都挺说过,就好比你手机上的闹钟,到了指定的时候就会响起. 今天在对redis缓存进行定时储存时又操作了一把,发现一些细节,写的不好.大家就将就看吧, 首先 简单介绍一下linux 例行性工 ...

  6. SpringMVC中定时任务配置

    在项目中使用定时任务是常有的事,比如每天定时进行数据同步或者备份等等. 以前在从事C语言开发的时候,定时任务都是通过写个shell脚本,然后添加到linux定时任务中进行调度的. 现在使用Spring ...

  7. springboot(九):定时任务

    在我们的项目开发过程中,经常需要定时任务来帮助我们来做一些内容,springboot默认已经帮我们实行了,只需要添加相应的注解就可以实现 1.pom包配置 pom包里面只需要引入springboot ...

  8. 详解java定时任务

    在我们编程过程中如果需要执行一些简单的定时任务,无须做复杂的控制,我们可以考虑使用JDK中的Timer定时任务来实现.下面LZ就其原理.实例以及Timer缺陷三个方面来解析JavaTimer定时器. ...

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

    Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运行十个,百个, ...

  10. 【译】Spring 4 基于TaskScheduler实现定时任务(注解)

    前言 译文链接:http://websystique.com/spring/spring-job-scheduling-with-scheduled-enablescheduling-annotati ...

随机推荐

  1. C# call webservice方法

    https://www.cnblogs.com/Fooo/p/5507153.html

  2. 2.nginx_rewrite模块

    rewrite syntax: rewrite regex replacement [flag] Default: — Context: server, location, if 如果正则表达式(re ...

  3. SPFA求最短路——Bellman-Ford算法的优化

    SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环.SPFA 最坏情况下复杂度和朴素 Bellman-Ford 相同,为 O(VE), ...

  4. MySQL学习基础知识1

    什么是数据库? 数据库就是存储数据的仓库. 存储方式: 变量 无法永久存储 文件处理,可以永久存储,弊端:文件只能在自己的计算机读写,无法被分享(局域网除外) 数据库分类: 1.关系型数据库 提供某种 ...

  5. 浅析Spring

    一:什么是Spring Spring是一个开源的框架,是为了解决企业应用程序开发复杂性由RodJohnson创建的.虽然Spring是为企业级应用推出的,但是所有的Java系统开发都可以使用Sprin ...

  6. JavaScript开发中常用的代码规范配置文件

    一.jsconfig.json { compilerOptions: { target: 'es6', experimentalDecorators: true, allowSyntheticDefa ...

  7. scws安装

    mkdir scws cd scws wget http://www.xunsearch.com/scws/down/scws-1.2.3.tar.bz2 tar xvjf scws-.tar.bz2 ...

  8. mysql全局权限账户%登录不上ERROR 1045 (28000): Access denied for user 'mhz'@'localhost' (using password: YES)

    mysql全局权限账户%登录不上ERROR 1045 (28000): Access denied for user 'mhz'@'localhost' (using password: YES) 解 ...

  9. C语言博客作业06——结构体&文件

    C语言博客作业06--结构体&文件 1.本章学习总结 1.1思维导图 1.2.本章学习体会 在本周的学习中,我们学习了关于结构体和文件的内容.结构体的本身并不难,但以结构体为基础的链表还是让我 ...

  10. Lending Club贷款数据分析

    python信用评分卡(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_camp ...