在我们平时项目中经常会遇到定时任务,比如定时同步数据,定时备份数据,定时统计数据等,定时任务我们都知道使用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任务框架的介绍。(源代码会跟随后面的例子一并上传),请继续关注以后章节。
Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有