在我们平时项目中经常会遇到定时任务,比如定时同步数据,定时备份数据,定时统计数据等,定时任务我们都知道使用Quartz.net,此系列写的也是Quartz,但是在此之前,我们先用其他方式做个简单的定时任务进行入门。

首先呢,我们现在自己先写一个简单的定时循环任务,话不多说,直接上代码:

第一步:创建项目,新建一个类库:我们命名为TaskBase

第二部:添加一个抽象基础类BaseMonitor:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace TaskBase
{
/// <summary>
/// 监测基础抽象类
/// </summary>
public abstract class BaseMonitor
{ protected System.Threading.Thread _thread;
/// <summary>
/// 监控时间间隔(毫秒)
/// </summary>
public virtual int Interval { get; set; } public virtual string Name { get; set; }
/// <summary>
/// 监控器状态
/// </summary>
public virtual TaskState State { get; set; }
public BaseMonitor(string name)
{
Name = name;
_thread = new System.Threading.Thread(BaseRun);
_thread.IsBackground = true;//获取或设置一个值,该值指示某个线程是否为后台线程
_thread.Start();
State = TaskState.运行;
}
private void BaseRun()
{
while (State==TaskState.运行)
{
try
{
Run();
System.Threading.Thread.Sleep(Interval);
}
catch (Exception ex)
{
State = TaskState.异常;
PCore.Log.LogTextHelper.WriteErrorLog(this.GetType().Name + "监控出现错误,此监视器已暂停!", ex);
}
}
}
protected virtual void Run()
{ }
}
}

(代码中PCore.Log.LogTextHelper.WriteErrorLog 是一个写文本日志的方法,可自行写个此方法。)

注:此定时任务基础类 是用 System.Threading.Thread 实现,其中 TaskState为一个枚举来表示任务的状态:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace TaskBase
{
public enum TaskState
{
未开始=,
运行=,
暂停=,
异常=
}
}

第三部:添加一个继承BaseMonitor的TestMontior类,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace TaskBase
{
public class TestMontior:BaseMonitor
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="name">检测器名称</param>
public TestMontior(string name) : base(name)
{
}
/// <summary>
/// 监控时间间隔(毫秒)
/// </summary>
public override int Interval
{
get
{
return GlobalConfig.TestMonitorInterval;
}
}
public override string Name
{
get
{
return base.Name;
} set
{
base.Name = value;
}
} public override TaskState State
{
get
{
return base.State;
} set
{
base.State = value;
}
}
protected override void Run()
{
PCore.Log.LogTextHelper.WriteLog("TestMontitor监测器正在监测");
}
}
}

注:TestMontior 相当于我们的Job,代码中 GlobalConfig是我定义的一个全局参数类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace TaskBase
{
public static class GlobalConfig
{
public static int TestMonitorInterval
{
get { return * ; }
} public static List<BaseMonitor> Monitor = new List<BaseMonitor>();
}
}

创建完成之后就是这个样子:

定时任务的基础类库已经创建完毕,下面我们来看怎么使用它。

第四部:在WEB中使用:创建一个WEB  MVC项目,引用TaskBase,然后在Global.asax中添加以下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing; namespace WebTaskTest
{
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles); TaskBase.GlobalConfig.Monitor.Add(new TaskBase.TestMontior("测试监控器Test"));//注册定时任务 }
}
}

运行WEB站点,查看日志如下:

可以看到一秒钟执行一次 ,因为我们在GlobalConfig.TestMonitorInterval设置的就是一秒钟。

下面我们看如何在windows server中如何使用:

创建一个WindowsServerTest类库,引用TaskBse,添加一个windows服务:

using Quartz;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks; namespace WindowsServerTest
{
partial class TestService : ServiceBase
{
public TestService()
{
InitializeComponent();
} protected override void OnStart(string[] args)
{
try
{
// TODO: 在此处添加代码以启动服务。
PCore.Log.LogTextHelper.WriteLog("OnStart:Test服务开始..."); TaskBase.GlobalConfig.Monitor.Add(new TaskBase.TestMontior("测试监控器Test"));//注册监视器 }
catch (Exception ex)
{
PCore.Log.LogTextHelper.WriteErrorLog("出错了",ex);
}
} protected override void OnStop()
{ // TODO: 在此处添加代码以执行停止服务所需的关闭操作。
PCore.Log.LogTextHelper.WriteLog("OnStop:Test服务结束...");
}
protected override void OnPause()
{
PCore.Log.LogTextHelper.WriteLog("OnPause:Test服务暂停...");
}
protected override void OnContinue()
{
PCore.Log.LogTextHelper.WriteLog("OnContinue:Test服务继续...");
}
}
}

关于windows服务的安装卸载可自行百度,再此不多哔哔了。

安装好服务开始后,我们查看下日志如下:

此节中我们简单做了一个定时任务,下章我们将进行Quartz.net任务框架的介绍。(源代码会跟随后面的例子一并上传),请继续关注以后章节。

.NET 任务调度Quartz系列(1)——自建定时任务的更多相关文章

  1. spring 任务调度quartz

    简单记录一下spring任务调度quartz的例子 首先添加包 quartz-2.2.3.jar 然后写个简单的TestJob类 package com.job; import java.util.D ...

  2. c/c++ 模板与STL小例子系列<一 >自建Array数组

    c/c++ 模板与STL小例子系列 自建Array数组 自建的Array数组,提供如下对外接口 方法 功能描述 Array() 无参数构造方法,构造元素个数为模板参数个的数组 Array(int le ...

  3. Storm编程入门API系列之Storm的定时任务实现

    概念,见博客 Storm概念学习系列之storm的定时任务 Storm的定时任务,分为两种实现方式,都是可以达到目的的. 我这里,分为StormTopologyTimer1.java   和  Sto ...

  4. Storm概念学习系列之storm的定时任务

    不多说,直接上干货! 至于为什么,有storm的定时任务.这个很简单.但是,这个在工作中非常重要! 假设有如下的业务场景 这个spoult源源不断地发送数据,boilt呢会进行处理.然后呢,处理后的结 ...

  5. 【优化技术专题】「温故而知新」基于Quartz系列的任务调度框架的动态化任务实现分析

    不提XXLJOB或者其他的调度框架,就看我接触的第一个任务调度框架Quartz(温故而知新) Quartz的动态暂停 恢复 修改和删除任务 实现动态添加定时任务,先来看一下我们初步要实现的目标效果图, ...

  6. 定时组件quartz系列<三>quartz调度机制调研及源码分析

    quartz2.2.1集群调度机制调研及源码分析引言quartz集群架构调度器实例化调度过程触发器的获取触发trigger:Job执行过程:总结:附: 引言 quratz是目前最为成熟,使用最广泛的j ...

  7. 定时组件quartz系列<一>模拟定时组件小程序

    一.核心概念 Quartz的原理不是很复杂,只要搞明白几个概念,然后知道如何去启动和关闭一个调度程序即可. 1.Job表示一个工作,要执行的具体内容.此接口中只有一个方法void execute(Jo ...

  8. 任务调度 QUARTZ

    任务调度在目前的JAVA应用程序中运用的十分普遍,故掌握QUARTZ是必备的技能 闲话少说,上官网:http://www.quartz-scheduler.org/ 下载最新1.80资源包 commo ...

  9. 分布式任务调度——quartz + spring + 数据库

        项目中使用分布式并发部署定时任务,多台跨JVM,按照常理逻辑每个JVM的定时任务会各自运行,这样就会存在问题,多台分布式JVM机器的应用服务同时干活,一个是加重服务负担,另外一个是存在严重的逻 ...

随机推荐

  1. Redis事务的简单理解

    Redis事务的命令如下所示: 先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令 示例如下: //开始一个事务 > MU ...

  2. 联想笔记本Win10 F1-F12失效的解决方法

    最近换了笔记本,用的是win10,发现F1到F12不生效. 比如玩游戏时,按F1没有切换到自己角色上,编程运行代码时的shift+F10也不行. 后来发现,这是因为某些笔记本的Fn功能键默认的不是传统 ...

  3. Python frozenset() 函数

    Python frozenset() 函数  Python 内置函数 描述 frozenset() 返回一个冻结的集合,冻结后集合不能再添加或删除任何元素. 语法 frozenset() 函数语法: ...

  4. docker搭建nginx

    在Docker下部署Nginx,包括: 部署一个最简单的Nginx,可以通过端口访问默认的网站 设置记录访问和错误日志的路径 以交互模式创建centos容器,如果本地没有镜像,会从仓库获取, 等待即可 ...

  5. 品味性能之道<七>:索引基础

    一.索引概述      索引(index),它是数据库必不可少的一部分.它其实很简单呐!很好理解.      索引好比如一本书的目录,一张地图,一个写字楼里挂在大堂墙上的公司名录,一个地铁站的出口指示 ...

  6. 简单解决 Javascrip 浮点数计算的 Bug(.toFixed(int 小数位数))

    众所周知,Javascript 在进行浮点数运算时,结果会非预期地出现一大长串小数. 解决: 如果变量 result 是计算结果,则在返回时这样写,return result.toFixed(2): ...

  7. 属性表格 datagridproperty

    http://www.cnblogs.com/yxlblogs/p/3468921.html

  8. redis学习-有序集合(zset)常用命令

    zadd:有序集合增加一个或者多个键值对 与set集合不同,zset添加的时候需要 指定 score,这个是用来排名的 zrange:返回指定范围的键 zcount:返回集合指定范围的个数(以每个键值 ...

  9. hdu-2844(完全背包+二进制优化模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2844 思路:问1-m能的得到的硬币的值,所以dp[i]==i即可. #include<iostr ...

  10. Spring 获取资源文件路径

    import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; s ...