在我们一直项目中平时会遇到定时职分

在大家经常项目中经常会遇到定期职责,例如定期同步数据,定时备份数据,定期总计数据等,定期职务大家都明白使用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>();
    }
}

创办完结以往正是那么些样子:

图片 1

定期职分的底蕴类库已经创办完结,上边我们来看怎么采用它。

 第四部:在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站点,查看日志如下:

图片 2

能够看来如日中天分钟试行一遍,因为大家在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服务的设置卸载可自动百度,再此十分少哔哔了。

设置好服务起前后相继,大家查阅下日志如下:

 图片 3

 

此节中大家大约做了三个定期任务,下章我们将进行Quartz.net任务框架的牵线。(源代码会尾随前面包车型地铁例证意气风发并上传),请继续关切之后章节。

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website