您的位置:威尼斯官方网站 > 威尼斯正规官网 > 我们现在自己先写一个简单的定时循环任务

我们现在自己先写一个简单的定时循环任务

发布时间:2019-11-21 16:17编辑:威尼斯正规官网浏览(150)

    在我们平时项目中经常会遇到定时任务,比如定时同步数据,定时备份数据,定时统计数据等,定时任务我们都知道使用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任务框架的介绍。(源代码会跟随后面的例子一并上传),请继续关注以后章节。

     

    本文由威尼斯官方网站发布于威尼斯正规官网,转载请注明出处:我们现在自己先写一个简单的定时循环任务

    关键词: