ASP.NET 定时执行任务 global.asax

  1. 方法一、  
  2.  using System;  
  3.   
  4.  using System.Data;  
  5.   
  6.  using System.Configuration;  
  7.   
  8.  using System.Collections;  
  9.   
  10.  using System.Web;  
  11.   
  12.  using System.Web.Security;  
  13.   
  14.  using System.Web.SessionState;  
  15.   
  16.  using System.Timers;  
  17.   
  18.  using System.Net;  
  19.   
  20.  using System.IO;  
  21.   
  22.  using System.Text;  
  23.   
  24.  using System.Threading;  
  25.   
  26.  namespace qumiao.com  
  27.   
  28.  {  
  29.   
  30.  public class Global : System.Web.HttpApplication  
  31.   
  32.  {  
  33.   
  34.  protected void Application_Start(object sender, EventArgs e)  
  35.   
  36.  {  
  37.   
  38.  //定义定时器  
  39.   
  40.  System.Timers.Timer myTimer = new System.Timers.Timer(5000);  
  41.   
  42.  myTimer.Elapsed += new ElapsedEventHandler(myTimer_Elapsed);  
  43.   
  44.  myTimer.Enabled = true;  
  45.   
  46.  myTimer.AutoReset = true;  
  47.   
  48.  }  
  49.   
  50.  void myTimer_Elapsed(object source, ElapsedEventArgs e)  
  51.   
  52.  {  
  53.   
  54.  try  
  55.   
  56.  {  
  57.   
  58.  Log.SaveNote(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":AutoTask is Working!");  
  59.   
  60.  YourTask();  
  61.   
  62.  }  
  63.   
  64.  catch (Exception ee)  
  65.   
  66.  {  
  67.   
  68.  Log.SaveException(ee);  
  69.   
  70.  }  
  71.   
  72.  }  
  73.   
  74.  void YourTask()  
  75.   
  76.  {  
  77.   
  78.  //在这里写你需要执行的任务  
  79.   
  80.  }  
  81.   
  82.  protected void Application_End(object sender, EventArgs e)  
  83.   
  84.  {  
  85.   
  86.  Log.SaveNote(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":Application End!");  
  87.   
  88.  //下面的代码是关键,可解决IIS应用程序池自动回收的问题  
  89.   
  90.  Thread.Sleep(1000);  
  91.   
  92.  //这里设置你的web地址,可以随便指向你的任意一个aspx页面甚至不存在的页面,目的是要激发Application_Start  
  93.   
  94.  string url = http://www.shaoqun.com  
  95.   
  96.  HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);  
  97.   
  98.  HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();  
  99.   
  100.  Stream receiveStream = myHttpWebResponse.GetResponseStream();//得到回写的字节流  
  101.   
  102.  }  
  103.   
  104.  }  
  105.   
  106.  }  
  107.   
  108.  原理:Global.asax 可以是asp.net中应用程序或会话事件处理程序,我们用到了Application_Start(应用程序开始事件)和Application_End(应用程序结束事件)。当应用程序开始时,启动一个定时器,用来定时执行任务YourTask()方法,这个方法里面可以写上需要调用的逻辑代码,可以是单线程和多线程。当应用程序结束时,如IIS的应用程序池回收,让asp.net去访问当前的这个web地址。这里需要访问一个aspx页面,这样就可以重新激活应用程序。Log类是一个记录日志的一个类,下面是测试时生成的日志信息:  
  109.   
  110.  ================================================================  
  111.   
  112.  2008-10-30 17:46:10:AutoTask is Working!  
  113.   
  114.  2008-10-30 17:46:15:AutoTask is Working!  
  115.   
  116.  2008-10-30 17:46:20:AutoTask is Working!  
  117.   
  118.  2008-10-30 17:46:23:Application End!  
  119.   
  120.  2008-10-30 17:46:29:AutoTask is Working!  
  121.   
  122.  2008-10-30 17:46:34:AutoTask is Working!  
  123.   
  124.  从日志中发现,当手动回收IIS的应用程序池之后,计划任务还在执行,说明我们的目的达到了。  
  125.   
  126.  如果将Application_End中的代码注释掉,会发现Application End之后,计划任务停止工作了,如下:  
  127.   
  128.  ================================================================  
  129.   
  130.  2008-10-30 18:01:34:AutoTask is Working!  
  131.   
  132.  2008-10-30 18:01:39:AutoTask is Working!  
  133.   
  134.  2008-10-30 18:01:44:AutoTask is Working!  
  135.   
  136.  2008-10-30 18:01:46:Application End!  
  137.   
  138.  局限性:可以解决应用程序池自动或者手动回收,但是无法解决IIS重启或者web服务器重启的问题,当然这种情况出现的时候不多,而且如果有人访问你的网站的时候,又会自动激活计划任务了。  
  139.   
  140.  方案二、  
  141.   
  142.  <%@ Application Language="C#" %>  
  143.   
  144.  <%@ import Namespace="System.IO" %>  
  145.   
  146.  <script runat="server">  
  147.   
  148.  void Application_Start(object sender, EventArgs e)  
  149.   
  150.  {  
  151.   
  152.  // 在应用程序启动时运行的代码  
  153.   
  154.  System.Timers.Timer myTimer = new System.Timers.Timer(10000);  
  155.   
  156.  myTimer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent);  
  157.   
  158.  myTimer.Interval = 10000;  
  159.   
  160.  myTimer.Enabled = true;  
  161.   
  162.  }  
  163.   
  164.  void Application_End(object sender, EventArgs e)  
  165.   
  166.  {  
  167.   
  168.  //  在应用程序关闭时运行的代码  
  169.   
  170.  }  
  171.   
  172.  void Application_Error(object sender, EventArgs e)  
  173.   
  174.  {  
  175.   
  176.  // 在出现未处理的错误时运行的代码  
  177.   
  178.  }  
  179.   
  180.  void Session_Start(object sender, EventArgs e)  
  181.   
  182.  {  
  183.   
  184.  // 在新会话启动时运行的代码  
  185.   
  186.  }  
  187.   
  188.  void Session_End(object sender, EventArgs e)  
  189.   
  190.  {  
  191.   
  192.  // 在会话结束时运行的代码。  
  193.   
  194.  // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为  
  195.   
  196.  // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer  
  197.   
  198.  // 或 SQLServer,则不会引发该事件。  
  199.   
  200.  }  
  201.   
  202.  private static void OnTimedEvent(object source, System.Timers.ElapsedEventArgs e)  
  203.   
  204.  {  
  205.   
  206.  //间隔时间执行某动作  
  207.   
  208.  //指定日志文件的目录  
  209.   
  210.  string fileLogPath = AppDomain.CurrentDomain.BaseDirectory + "SystemLog";  
  211.   
  212.  string fileLogName = "SoftPrj_CN_" + DateTime.Now.ToLongDateString() + "_log.txt";  
  213.   
  214.  //定义文件信息对象  
  215.   
  216.  FileInfo finfo = new FileInfo(fileLogPath + fileLogName);  
  217.   
  218.  //创建只写文件流  
  219.   
  220.  using (FileStream fs = finfo.OpenWrite())  
  221.   
  222.  {  
  223.   
  224.  //根据上面创建的文件流创建写数据流  
  225.   
  226.  StreamWriter strwriter = new StreamWriter(fs);  
  227.   
  228.  //设置写数据流的起始位置为文件流的末尾  
  229.   
  230.  strwriter.BaseStream.Seek(0, SeekOrigin.End);  
  231.   
  232.  //写入错误发生时间  
  233.   
  234.  strwriter.WriteLine("发生时间: " + DateTime.Now.ToString());  
  235.   
  236.  //写入日志内容并换行  
  237.   
  238.  //strwriter.WriteLine("错误内容: " + message);  
  239.   
  240.  strwriter.WriteLine("错误内容: ");  
  241.   
  242.  //写入间隔符  
  243.   
  244.  strwriter.WriteLine("---------------------------------------------");  
  245.   
  246.  strwriter.WriteLine();  
  247.   
  248.  //清空缓冲区内容,并把缓冲区内容写入基础流  
  249.   
  250.  strwriter.Flush();  
  251.   
  252.  //关闭写数据流  
  253.   
  254.  strwriter.Close();  
  255.   
  256.  fs.Close();  
  257.   
  258.  }  
  259.   
  260.  }  
  261.   
  262.  </script>  
  263.   
  264.  方案三、  
  265.   
  266.  <%@ Application Language="C#" %>  
  267.   
  268.  <%@ Import Namespace="System.IO" %>  
  269.   
  270.  <%@ Import Namespace="System.Threading" %>  
  271.   
  272.  <script RunAt="server">  
  273.   
  274.  string LogPath;  
  275.   
  276.  Thread thread;  
  277.   
  278.  void WriteLog()  
  279.   
  280.  {  
  281.   
  282.  while (true)  
  283.   
  284.  {  
  285.   
  286.  StreamWriter sw = new StreamWriter(LogPath, true, Encoding.UTF8);  
  287.   
  288.  sw.WriteLine(thread.Name + ":" + DateTime.Now.ToString());  
  289.   
  290.  sw.Close();  
  291.   
  292.  Thread.CurrentThread.Join(1000 * 10);//阻止10秒  
  293.   
  294.  }  
  295.   
  296.  }  
  297.   
  298.  void Application_Start(object sender, EventArgs e)  
  299.   
  300.  {  
  301.   
  302.  LogPath = HttpContext.Current.Server.MapPath("log.txt");        //在应用程序启动时运行的代码  
  303.   
  304.  thread = new Thread(new ThreadStart(WriteLog));  
  305.   
  306.  thread.Name = "写登录日志线程";  
  307.   
  308.  thread.Start();  
  309.   
  310.  }  
  311.   
  312.  void Application_End(object sender, EventArgs e)  
  313.   
  314.  {  
  315.   
  316.  //  在应用程序关闭时运行的代码  
  317.   
  318.  }  
  319.   
  320.  void Application_Error(object sender, EventArgs e)  
  321.   
  322.  {  
  323.   
  324.  // 在出现未处理的错误时运行的代码  
  325.   
  326.  }  
  327.   
  328.  void Session_Start(object sender, EventArgs e)  
  329.   
  330.  {  
  331.   
  332.  // 在新会话启动时运行的代码  
  333.   
  334.  }  
  335.   
  336.  void Session_End(object sender, EventArgs e)  
  337.   
  338.  {  
  339.   
  340.  // 在会话结束时运行的代码。  
  341.   
  342.  // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为  
  343.   
  344.  // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer  
  345.   
  346.  // 或 SQLServer,则不会引发该事件。  
  347.   
  348.  }  
  349.   
  350.  </script> 
http://blog.csdn.net/zanychou/article/details/7282709
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值