zoukankan      html  css  js  c++  java
  • 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;
            }
        }
  • 相关阅读:
    ef左联三张表案例
    sql常用语句汇总
    最初的ajax案例
    asp.net mvc请求响应模型原理回顾
    viewstate cookie和session原理回顾
    一般处理程序装配数据到html页的原理
    asp.net页面生命周期回顾
    rocketMQ 消息的 tag
    rocketMQ 订阅关系
    rocketMQ retry 消息的实现
  • 原文地址:https://www.cnblogs.com/tider1999/p/4170017.html
Copyright © 2011-2022 走看看