在我們平時項目中經常會遇到定時任務,比如定時同步數據,定時備份數據,定時統計數據等,定時任務我們都知道使用Quartz.net,此系列寫的也是Quartz,但是在此之前,我們先用其他方式做個簡單的定時任務進行入門。 首先呢,我們現在自己先寫一個簡單的定時迴圈任務,話不多說,直接上代碼: 第一步:創建 ...
在我們平時項目中經常會遇到定時任務,比如定時同步數據,定時備份數據,定時統計數據等,定時任務我們都知道使用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任務框架的介紹。(源代碼會跟隨後面的例子一併上傳),請繼續關註以後章節。