专业网站建设品牌,十四年专业建站经验,服务6000+客户--广州京杭网络
免费热线:400-683-0016      微信咨询  |  联系我们

C#教程之C#教程之.NET 任务调度Quartz系列——自建定时

当前位置:网站建设 > 技术支持
资料来源:网络整理       时间:2023/2/14 1:10:41       共计:3607 浏览

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

版权说明:
本网站凡注明“广州京杭 原创”的皆为本站原创文章,如需转载请注明出处!
本网转载皆注明出处,遵循行业规范,如发现作品内容版权或其它问题的,请与我们联系处理!
欢迎扫描右侧微信二维码与我们联系。
·上一条:用Nginx部署vue项目后刷新出现404的问题 | ·下一条:windows server 2016 活动目录部署系列(五)域控制器的备份和还原

Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有    粤ICP备16019765号 

广州京杭网络科技有限公司 版权所有