Timer使用方法

Timer的局限性:一般用于短间隔的重复任务,如果你的任务是以天、月、年等为间隔,Timer误差较大。

Timer成功使用方法:

1、在Global.asax中写入

 1 protected void Application_Start()
 2         {
 3             
 4             //启动定时器
 5             MyTimer.GetTimerStart();
 6         }
 7 
 8         protected void Application_End(object sender, EventArgs e)
 9         {
10             //下面的代码是关键,可解决IIS应用程序池自动回收的问题
11             System.Threading.Thread.Sleep(1000);
12             //触发事件, 写入提示信息           
13             //这里设置你的web地址,可以随便指向你的任意一个aspx页面甚至不存在的页面,目的是要激发Application_Start
14             //使用您自己的URL
15             string url = "http://localhost:3813";
16             System.Net.HttpWebRequest myHttpWebRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
17             System.Net.HttpWebResponse myHttpWebResponse = (System.Net.HttpWebResponse)myHttpWebRequest.GetResponse();
18             System.IO.Stream receiveStream = myHttpWebResponse.GetResponseStream();//得到回写的字节流
19 
20             // 在会话结束时运行的代码。
21             // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为 InProc 时,才会引发 Session_End 事件。
22             // 如果会话模式设置为 StateServer
23             // 或 SQLServer,则不会引发该事件。
24         }

解决IIS自动回收进程的办法就是:进程回收时,Global.asax 中的 protected void Application_End 会自动执行,这时让程序随便访问一个网页,进程就会被激活。

2、是一个自己写一个类 MyTimer ,里面包含定时任务:

namespace JHABB.common
{
    public static class MyTimer
    {
        private static Timer mytimer = new Timer();

        /// <summary>
        /// 定义Timer
        /// </summary>
        public static void GetTimerStart()
        {
            // 循环间隔时间(30s),单位:毫秒
            mytimer.Interval = 30000;
            // 允许Timer执行
            mytimer.Enabled = true;
            //回调
            mytimer.Elapsed += new ElapsedEventHandler(mytimer_Elapsed);        //mytimer.Elapsed +=mytimer_Elapsed  这样也可以
            //多次循环
            mytimer.AutoReset=true;
        }
        /// <summary>
        /// Timer执行的操作
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private static void mytimer_Elapsed(object sender, ElapsedEventArgs e)
        {

            //具体的定时任务

        }
    }
}

 3、可以进一步扩展,比如(http://www.cnblogs.com/fujet/p/4337392.html):

class Work2
    {
        private Timer _workTimer;
        public string TaskType { get; set; }
        public void DoWork()
        {

            _workTimer = new System.Timers.Timer();
            _workTimer.Interval = 1000;
            _workTimer.Elapsed += new ElapsedEventHandler(TimerHanlder);
            _workTimer.Start();
        }

        private void TimerHanlder(object sender, ElapsedEventArgs e)
        {
            _workTimer.Stop();

            var interval = 1 * 60 * 1000;//处理失败,1分钟后重试
            var maxTimes = 5;
            var retryTimes = 0;

            while (retryTimes < maxTimes)
            {
                var ok = Proccess();
                if (ok)
                {
                    retryTimes = maxTimes;
                }
                else
                {
                    retryTimes++;
                    System.Threading.Thread.Sleep(interval);
                }

            }

            var times = GetTotalSecondsForNext();
            Console.WriteLine("{0}秒后重新执行", times);
            _workTimer.Interval = times * 1000;//计算离下一次开始处理的时间
            _workTimer.Start();

        }

        private bool Proccess()
        {
            Console.WriteLine("开始执行处理:{0}", TaskType);
            return true;
        }

        private int GetTotalSecondsForNext()
        {
            //这里根据自己的业务来决定
            return 3;
        }
    }
原文地址:https://www.cnblogs.com/tider1999/p/4170017.html