ASP.NET 计划任务,使用.net内部机制,解决应用池回收问题
来源:互联网 发布:淘宝网双11销售额 编辑:程序博客网 时间:2024/06/05 11:30
在复杂的业务应用程序中,有时候会要求一个或者多个任务在一定的时间或者一定的时间间隔内计划进行,比如定时备份或同步数据库,定时发送电子邮件,定期处理用户状态信息,支付系统中定期同步异常账单等等,我们称之为计划任务。
现计划任务的方法也有很多,可以采用SQLAgent执行存储过程,采用Windows任务调度程序来实现,也可以使用Windows服务来完成我们的计划任务,这些方法都是不错的解决方案。但是,以上这些都需要有服务器的权限才能进行,而对于虚拟主机客户使用的Web应用程序来说,这些方法实现起来并不是很简单的,主机服务提供商或者不能直接提供这样的服务,或者需要你支付许多额外的费用。 看过一些这方面的文章,发现有一个共同的缺点:IIS运行到一定时期,计划任务就停止了。查找原因发现是IIS的应用程序池定期回收导致计划任务停止。本文的这个方法可以解决应用程序池回收问题。
在Global.asax 文件中作如下修改:
Application_Start 只有在访问一次之后才会触发.
void Application_Start(object sender, EventArgs e) { // 在应用程序启动时运行的代码 //定义定时器 //1000表示1秒的意思 System.Timers.Timer myTimer = new System.Timers.Timer(1000); //TaskAction.SetContent 表示要调用的方法 myTimer.Elapsed += new System.Timers.ElapsedEventHandler(TaskAction.SetContent); myTimer.Enabled = true; myTimer.AutoReset = true; }
添加计划任务类 TaskAction
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Timers; /// <summary> ///Action 的摘要说明 /// </summary> public static class TaskAction { private static string content = ""; /// <summary> /// 输出信息存储的地方. /// </summary> public static string Content { get { return TaskAction.content; } set { TaskAction.content += "<div>" + value+"</div>"; } } /// <summary> /// 定时器委托任务 调用的方法 /// </summary> /// <param name="source"></param> /// <param name="e"></param> public static void SetContent(object source, ElapsedEventArgs e) { Content = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); } /// <summary> /// 应用池回收的时候调用的方法 /// </summary> public static void SetContent() { Content = "END: " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); } }
执行结果输出[Default.aspx] (此步仅仅为了观看结果才写的页面)
<div> <%=TaskAction.Content %> </div>
为防止应用池回收,有两种写法,一种需要web.config 对session 进行设置,另外一种不需要,看自己情况处理
Session_End 中的方法主要是解决IIS应用程序池自动回收的问题.
void Session_End(object sender, EventArgs e) { //下面的代码是关键,可解决IIS应用程序池自动回收的问题 System.Threading.Thread.Sleep(1000); //触发事件, 写入提示信息 TaskAction.SetContent(); //这里设置你的web地址,可以随便指向你的任意一个aspx页面甚至不存在的页面,目的是要激发Application_Start //使用您自己的URL string url = "http://henw.cnblog.com"; System.Net.HttpWebRequest myHttpWebRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url); System.Net.HttpWebResponse myHttpWebResponse = (System.Net.HttpWebResponse)myHttpWebRequest.GetResponse(); System.IO.Stream receiveStream = myHttpWebResponse.GetResponseStream();//得到回写的字节流 // 在会话结束时运行的代码。 // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为 InProc 时,才会引发 Session_End 事件。 // 如果会话模式设置为 StateServer // 或 SQLServer,则不会引发该事件。 }
另外一种写法,Global.asax.cs全文,和以上写法无关联
using System;using System.Data;using System.Configuration;using System.Collections;using System.Web;using System.Web.Security;using System.Web.SessionState;using System.Timers;using System.net;using System.IO;using System.Text;using System.Threading;namespace aaaaaaa{ public class Global : System.Web.HttpApplication { protected void Application_Start(object sender, EventArgs e) { //定义定时器 System.Timers.Timer myTimer = new System.Timers.Timer(5000); myTimer.Elapsed += new ElapsedEventHandler(myTimer_Elapsed); myTimer.Enabled = true; myTimer.AutoReset = true; } void myTimer_Elapsed(object source, ElapsedEventArgs e) { try { Log.SaveNote(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":AutoTask is Working!"); YourTask(); } catch (Exception ee) { Log.SaveException(ee); } } void YourTask() { //在这里写你需要执行的任务 } protected void Application_End(object sender, EventArgs e) { Log.SaveNote(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":Application End!"); //下面的代码是关键,可解决IIS应用程序池自动回收的问题 Thread.Sleep(1000); //这里设置你的web地址,可以随便指向你的任意一个ASPx页面甚至不存在的页面,目的是要激发Application_Start //string url = "http://www.aaa.com";手机主题 string url = "http://localhost:82/111.aspx"; HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url); HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse(); Stream receiveStream = myHttpWebResponse.GetResponseStream();//得到回写的字节流 } }}
- ASP.NET 计划任务,使用.net内部机制,解决应用池回收问题
- asp.net计划任务-解决应用池回收问题
- asp.net计划任务-解决应用池回收问题
- ASP.NET 计划任务(不使用外接程序,.net内部机制实现)
- ASP.NET 计划任务(不使用外接程序,.net内部机制实现)
- asp.net后台自动任务-解决应用池回收问题(转)
- asp.net计划任务
- ASP.NET定时执行任务 (不使用外接程序,.net内部机制实现)
- asp.net实现计划任务
- asp.net Global计划任务
- 浅谈Asp.Net内部机制
- ASP.NET MVC 使用 FluentScheduler 定时器计划任务
- .net回收机制的使用
- .net回收机制的使用
- asp.net 线程控制计划任务
- asp.net定时实现计划任务
- asp.net 计划任务管理程序实现,多线程
- Asp.Net中的GC(垃圾回收机制)
- Ill-advised or mistaken usage of a core class (java.* or javax.*) Conversion to Dalvik format fail
- tomcat的URIEncoding的作用(转)
- 快速配置 Samba 将 Linux 目录映射为 Windows 驱动器,用于跨平台编程
- 使用reportlab生成中文表格pdf
- linux模块参数分析
- ASP.NET 计划任务,使用.net内部机制,解决应用池回收问题
- Selenium实例----12306网站测试
- 思维导图
- easyUI跨tab刷新datagrid
- jQuery表单AJAX提交插件学习
- 体验报告-WebBuilder 6.8真的来了
- 金山逍遥网 sersync 服务器实时镜像、自动同步程序开源
- 通过设计器修改表结构,“不允许保存更改”
- Unity中扫雷游戏的脚本编写