阻止Application_End事件的解决方案
2010-10-14 17:16
218 查看
在做项目时,遇到同步ERP数据的问题,客户要求是:程序中,设置一个开始时间,再设置一个时间间隔,让程序每隔一段时间导出销售记录,这个开始时间和时间间隔可以手动修改设定。
这问题纠缠了我好几天,总算解决了,写文档记录:
首先,要让程序定时执行任务,可以使用ASP.NET中的Timer计时,不过这个定时不是很准,如果用它,还会遇到其他的问题,后面会提到。第二种方法是,使用一个叫做:Quartz.NET开源项目,专门用来调度定时作业。
这次项目中,我用到的就是Quartz.NET组件,用他来定时调度作业,是很方便,不过问题也来了:当程序运行一段时间后,发现自动任务停止了。在网上查了查资料,说法不一。
后来多方查资料以及自己试验证明:原来是网站应用程序在没有请求时,过一定的时间就会停止应用程序,具体点来说,就是网站中的最后一个session结束时,网站应用程序就会结束。当然就会触发Application_End事件。随之定时任务也会停掉。
现在的问题就是:如何让网站都有请求?如何让Application_End事件不会发生?
这个问题在网上也有很多种说法,比如有人建议:在Application_End中用程序模拟请求网站,重新开始Application_Start事件,也给出了程序代码:http://asdfblog.com/technology/aspnet-scheduled-tasks-with-quartznet.html这里有详细说明。不过我照博主的做法,并没有实现我想要的功能。不过他是用来处理IIS应用程序池回收的问题的。
孟子E章说:新建一个独立的线程来调度执行的任务,个人认为比较麻烦,没采用这种方式。
最后,发现了一个简单的处理方式,利用ASP.NET的缓存超时技术。下面具体来阐明,基本思路:
在应用程序启动时,用程序缓存一个网站中的页面。在缓存网页时,设置好缓存过期时间,以及缓存过期时触发的回调事件,缓存过期时触发的回调事件这是关键。在缓存过期时用程序模拟请求网站页面,再次缓存,循环之…
代码说明:(全在Global.asax里)
这样,网站应用程序就可以像运行windows服务一样,在后台默默的执行了,没看明白,可以参见这里:http://www.codeproject.com/KB/aspnet/ASPNETService.aspx
附:Quartz.Net详细教程参见:
①官方教程:http://quartznet.sourceforge.net/tutorial/index.html;
②中文翻译:http://www.cnblogs.com/shanyou/category/102991.html
这问题纠缠了我好几天,总算解决了,写文档记录:
首先,要让程序定时执行任务,可以使用ASP.NET中的Timer计时,不过这个定时不是很准,如果用它,还会遇到其他的问题,后面会提到。第二种方法是,使用一个叫做:Quartz.NET开源项目,专门用来调度定时作业。
这次项目中,我用到的就是Quartz.NET组件,用他来定时调度作业,是很方便,不过问题也来了:当程序运行一段时间后,发现自动任务停止了。在网上查了查资料,说法不一。
后来多方查资料以及自己试验证明:原来是网站应用程序在没有请求时,过一定的时间就会停止应用程序,具体点来说,就是网站中的最后一个session结束时,网站应用程序就会结束。当然就会触发Application_End事件。随之定时任务也会停掉。
现在的问题就是:如何让网站都有请求?如何让Application_End事件不会发生?
这个问题在网上也有很多种说法,比如有人建议:在Application_End中用程序模拟请求网站,重新开始Application_Start事件,也给出了程序代码:http://asdfblog.com/technology/aspnet-scheduled-tasks-with-quartznet.html这里有详细说明。不过我照博主的做法,并没有实现我想要的功能。不过他是用来处理IIS应用程序池回收的问题的。
孟子E章说:新建一个独立的线程来调度执行的任务,个人认为比较麻烦,没采用这种方式。
最后,发现了一个简单的处理方式,利用ASP.NET的缓存超时技术。下面具体来阐明,基本思路:
在应用程序启动时,用程序缓存一个网站中的页面。在缓存网页时,设置好缓存过期时间,以及缓存过期时触发的回调事件,缓存过期时触发的回调事件这是关键。在缓存过期时用程序模拟请求网站页面,再次缓存,循环之…
代码说明:(全在Global.asax里)
private const string DummyPageUrl = "http:/index.aspx"; private const string DummyCacheItemKey = "GagaGuguGigi"; Quartz.IScheduler sched = SingletonScheduler.GetIntance(); void Application_Start(object sender, EventArgs e) { //缓存页面 RegisterCacheEntry(); } // 注册一缓存条目在5分钟内到期,到期后触发的调事件 private void RegisterCacheEntry() { if (null != HttpContext.Current.Cache[DummyCacheItemKey]) return; HttpContext.Current.Cache.Add(DummyCacheItemKey, "Test", null, DateTime.MaxValue, TimeSpan.FromMinutes(5), CacheItemPriority.NotRemovable, new CacheItemRemovedCallback(CacheItemRemovedCallback)); } // 缓存项过期时程序模拟点击页面,阻止应用程序结束 public void CacheItemRemovedCallback(string key, object value, CacheItemRemovedReason reason) { HitPage(); } // 模拟点击网站网页 private void HitPage() { System.Net.WebClient client = new System.Net.WebClient(); client.DownloadData(DummyPageUrl); } protected void Application_BeginRequest(Object sender, EventArgs e) { if (HttpContext.Current.Request.Url.ToString() == DummyPageUrl) { RegisterCacheEntry(); } }
这样,网站应用程序就可以像运行windows服务一样,在后台默默的执行了,没看明白,可以参见这里:http://www.codeproject.com/KB/aspnet/ASPNETService.aspx
附:Quartz.Net详细教程参见:
①官方教程:http://quartznet.sourceforge.net/tutorial/index.html;
②中文翻译:http://www.cnblogs.com/shanyou/category/102991.html
相关文章推荐
- 阻止Application_End事件的解决方案
- 阻止Application_End事件的解决方案
- 如何统计网站访问量,代码实现使用全局变量 Application,start,end,Session_start,Session_end事件
- 处理WM_QUERYENDSESSION 阻止Windows关机事件
- IScroll.js移动端点击事件被阻止的解决方案.
- touchend事件的preventDefault阻止掉了click事件
- 解决Application、Session丢失问题 — ASP.NET Application_End事件
- Application_Start和Application_End事件执行时间
- Application_Start和Application_End事件执行时间
- asp.net 中止Global.asax Application_End事件 避免应用程序池回收 定时任务
- 跟踪Application_End事件的技巧
- 如何统计网站访问量,代码实现使用全局变量 Application,start,end,Session_start,Session_end事件
- [置顶] 如何统计网站访问量,代码实现使用全局变量 Application,start,end,Session_start,Session_end事件
- 百度地图API的事件处理:覆盖物的如何阻止冒泡
- 阻止事件冒泡
- ASP.NET 用 Global.asax 的Application_BeginRequest 事件过滤恶意提交
- 在Closing事件里阻止窗口关闭
- 转:Global.asax通过Application_BeginRequest()事件实现访问链接的静态地址映射
- cocos2d-x添加触摸层阻止后端事件
- JS阻止事件冒泡的3种方法之间的不同