.NET 任务调度Quartz系列(1)——自建定时任务
在我们平时项目中经常会遇到定时任务,比如定时同步数据,定时备份数据,定时统计数据等,定时任务我们都知道使用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 { 未开始=0, 运行=1, 暂停=2, 异常=3 } }
第三部:添加一个继承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 100 * 10; } } 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任务框架的介绍。(源代码会跟随后面的例子一并上传),请继续关注以后章节。
上一篇: C#多线程编程系列(三)- 线程同步
推荐阅读
-
net core WebApi——定时任务Quartz
-
C#/.NET/.NET Core定时任务调度的方法或者组件有哪些--Timer,FluentScheduler还是...
-
详解免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)
-
SpringBoot系列:Spring Boot集成定时任务Quartz
-
.NET中Quartz任务调度器的简单应用实例
-
控制台基于Quartz.Net组件实现定时任务调度(一)
-
Asp.Net Core 使用Quartz基于界面画接口管理做定时任务
-
quartz+corn表达式实现定时调度任务
-
用abp vNext快速开发Quartz.NET定时任务管理界面
-
Window服务基于Quartz.Net组件实现定时任务调度(二)