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模型。

当然,这样直接去改配置文件也不方便,我们应该弄一个页面,在代码里面去修改配置文件的参数,这样就可以交给不懂代码的人去维护了。

猜你喜欢

转载自blog.csdn.net/u012835032/article/details/80882045
今日推荐