在我们平时项目中经常会遇到定时任务,比如定时同步数据,定时备份数据,定时统计数据等,定时任务我们都知道使用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. ubuntu安装谷歌拼音输入法

    在这篇教程中,我将告诉你如何在ubuntu系统上安装谷歌拼音输入法.谷歌拼音输入法有基于ibus框架的,也有基于fcitx框架的.我只演示fcitx框架下谷歌拼音输入法的安装,因为ibus框架的谷歌拼 ...

  2. X_PU

    通俗易懂告诉你CPU/GPU/TPU/NPU...XPU都是些什么鬼?[附把妹秘籍] 2017-10-27 19:54移动芯片/谷歌 作者:iot101君 物联网智库 原创 转载请注明来源和出处 现在 ...

  3. 38. Count and Say (String; DP)

    The count-and-say sequence is the sequence of integers beginning as follows:1, 11, 21, 1211, 111221, ...

  4. python之多线程队列

    # 一共有以下3种队列# 1.先进先出# 2.后进先出# 3.存储数据的时候可设置优先级的队列,设置不同的优先级,取的时候按照优先级的顺序来取 下面介绍一下队列的方法,如果要使用队列,则需要导入一个模 ...

  5. jquery 赋值时不触发change事件解决

    $("#optionsId").change(function(){ $("#selectOptionsText").val('测试'); }); $(&quo ...

  6. win10下zip安装mysql5.7的一些问题

    一.MySQL下载地址: http://dev.mysql.com/downloads/mysql/ 我们下载zip版本的   二.解压zip文件   三.复制一份里面的my-default.ini为 ...

  7. MVC扩展HtmlHelper,加入RadioButtonList、CheckBoxList、DropdownList

    代码: using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions ...

  8. laravel配置路由出现404

    nginx配置上加一句话 location / { #try_files $uri $uri/ =; try_files $uri $uri/ /index.php?$query_string; }

  9. html5移动开发。

    禁止滚动 $('#idl').bind("touchmove",function(e){ e.preventDefault(); }); 图片居中 (因为图片比较特别,所以需要在外 ...

  10. 2018.08.04 洛谷P3380 【模板】二逼平衡树(树套树)

    传送门 技不如人,写的权值线段树套线段树在bzoj上无论如何都卡不过空间. 这是一道树套树简单题,感觉没什么好说的. 直接权值线段树套平衡树就行了. 代码: #include<bits/stdc ...