1. 程式人生 > >ASP.NET 定時器(System.Timers.Timer)- 伺服器端篇

ASP.NET 定時器(System.Timers.Timer)- 伺服器端篇

Timer – 計時器或者定時器,跟JavaScript的setInterval有很多相似之處,都是在給定的時間之後做一定的操作。

建構函式
Timer() 初始化 Timer 類的新例項,並將所有屬性設定為初始值。
Timer(Double) 初始化 Timer 類的新例項,並將 Interval 屬性設定為指定的毫秒數。

主要屬性
AutoReset 獲取或設定一個布林值,該值指示 Timer 是否應只引發一次 Elapsed 事件((false) 或重複 (true))。
Enabled 獲取或設定一個值,該值指示 Timer 是否應引發 Elapsed 事件。
Interval 獲取或設定引發 Elapsed 事件的間隔(以毫秒為單位)。

主要方法
Start() 通過將 Enabled 設定為 true 開始引發 Elapsed 事件。

事件
Elapsed 達到間隔時發生。
Disposed 通過呼叫釋放元件時發生 Dispose 方法。(繼承自 Component。)

一個栗子:建一個xml配置檔案,根據配置檔案在APP開始的時候建立定時器,讓它執行我們的方法。

Timer配置檔案(XML)

<?xml version="1.0" encoding="utf-8" ?>
<Timer>
  <AutoReset>1</AutoReset>
  <Enabled
>
1</Enabled> <Interval>10000</Interval> <Start>1</Start> <Suspend>1</Suspend> </Timer>

讀取配置檔案類

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Xml;

namespace WebApplication1
{
    public class ConfigureXML
    {
        public
static TimerModel GetValueByCode(string xmlUrl) { XmlDocument doc = new XmlDocument(); doc.Load(xmlUrl); if (doc == null) { return null; } XmlNode timerNode = doc.SelectSingleNode("Timer"); if (timerNode == null) { return null; } TimerModel timerModel = new TimerModel(); try { timerModel.AutoReset = timerNode.SelectSingleNode("AutoReset").InnerText.Equals("1") ? true : false; } catch { timerModel.AutoReset = true; } try { timerModel.Enabled = timerNode.SelectSingleNode("Enabled").InnerText.Equals("1") ? true : false; } catch { timerModel.Enabled = true; } try { timerModel.Interval = Convert.ToDouble("0" + timerNode.SelectSingleNode("Interval").InnerText); } catch { timerModel.Interval = 60000d; } try { timerModel.Start = timerNode.SelectSingleNode("Start").InnerText.Equals("1") ? true : false; } catch { timerModel.Start = false; } try { timerModel.Suspend = timerNode.SelectSingleNode("Suspend").InnerText.Equals("1") ? true : false; } catch { timerModel.Suspend = true; } return timerModel; } } }

自定義Timer模型

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace WebApplication1
{
    public class TimerModel
    {
        /// <summary>
        /// 獲取或設定一個值,該值指示 System.Timers.Timer 是應在每次指定的間隔結束時引發 System.Timers.Timer.Elapsed事件,還是僅在指定的間隔第一次結束後引發該事件。
        /// </summary>
        public bool AutoReset { get; set; }

        /// <summary>
        /// 獲取或設定一個值,該值指示 System.Timers.Timer 是否應引發 System.Timers.Timer.Elapsed 事件。
        /// </summary>
        public bool Enabled { get; set; }

        /// <summary>
        /// 獲取或設定引發 System.Timers.Timer.Elapsed 事件的間隔
        /// </summary>
        public double Interval { get; set; }

        /// <summary>
        /// 是否啟用定時器
        /// </summary>
        public bool Start { get; set; }

        /// <summary>
        /// 是否暫停定時器
        /// </summary>
        public bool Suspend { get; set; }
    }
}

定時器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Timers;

namespace WebApplication1
{
    public class TimerJob
    {
        string timerXmlUrl = @"C:\Users\Administrator\Documents\Visual Studio 2013\Projects\Test20180607\WebApplication1\TimerConfig.xml";

        public TimerJob()
        { }

        public void Start()
        {
            TimerModel timerModel = ConfigureXML.GetValueByCode(timerXmlUrl);
            if (timerModel != null && timerModel.Start)
            {
                Timer timer = timer = new Timer(timerModel.Interval);
                timer.AutoReset = timerModel.AutoReset;
                timer.Enabled = timerModel.Enabled;
                timer.Elapsed += new ElapsedEventHandler(OnElapsedEvent);
                timer.Start();
            }
        }

        /// <summary>
        /// Timer的Elapsed事件執行的方法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnElapsedEvent(Object sender, ElapsedEventArgs e)
        {
            //這裡就是我們這個定時器要執行的程式碼,我亂寫的_._
            TimerModel timerModel = ConfigureXML.GetValueByCode(timerXmlUrl);
            //控制是否執行邏輯程式碼
            if (timerModel != null && !timerModel.Suspend)
            {
                Test test = new Test();
                test.GUID = DateTime.Now.ToString();
                DB_TestEntities db = new DB_TestEntities();
                db.Test.Add(test);
                db.SaveChanges();
            }
        }
    }
}

定時器入口(就是啟動定時器的地方):Global

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;

namespace WebApplication1
{
    public class Global : System.Web.HttpApplication
    {

        protected void Application_Start(object sender, EventArgs e)
        {
            TimerJob job = new TimerJob();
            job.Start();
        }

        protected void Session_Start(object sender, EventArgs e)
        {

        }

        protected void Application_BeginRequest(object sender, EventArgs e)
        {

        }

        protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {

        }

        protected void Application_Error(object sender, EventArgs e)
        {

        }

        protected void Session_End(object sender, EventArgs e)
        {

        }

        protected void Application_End(object sender, EventArgs e)
        {

        }
    }
}

這樣,一個簡單的定時器就出來了,通過修改配置檔案的引數,可以控制定時器開啟/禁用、暫停/繼續。至於每個引數是什麼意思,可以參考Timer模型。

當然,這樣直接去改配置檔案也不方便,我們應該弄一個頁面,在程式碼裡面去修改配置檔案的引數,這樣就可以交給不懂程式碼的人去維護了。