阻止Application_End事件的解决方案

在做项目时,遇到同步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里)
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

 ====================================2013-8-2  后记================================================

在WebForm中使用Quartz.Net组件,个人测试结果,感觉也不够稳定,最终是由 Winform客户端程序+Quartz.NET组件实现,程序一直放在服务器上跑着。

为了防止服务器端程序停掉,可以写成windows服务,这样服务器一启动,就会执行任务,只要服务器没停,程序也会一直运行。

当然,这只能适用于独立主机,虚拟空间就不行了。

附:

1.如何编写windows服务:

http://msdn.microsoft.com/zh-cn/library/vstudio/9k985bc9.aspx

http://www.cnblogs.com/tuyile006/archive/2006/11/27/573654.html

2.windows服务辅助类:http://blog.csdn.net/a497785609/article/details/9103129

时间: 2024-10-03 22:54:27

阻止Application_End事件的解决方案的相关文章

怎么来阻止 Application_End事件

问题描述 ASP.NET做了一个TIMER定时任务,原来是网站应用程序在没有请求时,过一定的时间就会停止应用程序,具体点来说,就是网站中的最后一个session结束时,网站应用程序就会结束.当然就会触发Application_End事件.随之定时任务也会停掉.怎么来阻止Application_End事件呢? 解决方案 解决方案二:你还是在你的服务器放一个定时服务吧,或者计划任务.解决方案三:网站回收会触发Application_End应该采取一个线程访问自己解决方案四: 解决方案五:学习解决方案

js-关于不同浏览器中JS阻止默认事件preventDefault()方法!

问题描述 关于不同浏览器中JS阻止默认事件preventDefault()方法! 今天在学习HTML5时候学到拖动图片到一个DIV中,采用preventDefault阻止图片默认行为, 在IE,谷歌中都可以,但是火狐却不行,拖放图片时候还是会打开新的页面.查了很多资料 都说IE要特殊写,火狐不用.这个网站大家可以测试,火狐到底该怎么写呢,请问!http://www.runoob.com/try/try.php?filename=tryhtml5_draganddrop2 解决方案 jquery.

application_end 事件什么时候执行

问题描述 为什么写在这个事件里的代码不能执行呢?而相同的代码在其他地方就可以 解决方案 解决方案二:把vs自带的web服务器asp.netdevelopmentserver关闭,测试下解决方案三:HttpApplication实例处理该请求以及后面的请求,直到最后一个实例退出并引发Application_End事件解决方案四:以下两种情况会执行application_end事件1.关机2.修改了web.config文件解决方案五:又有一个发现在该事件中的代码可以执行.在事件application

ASP.Net防止刷新自动触发事件的解决方案

使用asp.net,在刷新页面的时候会自动触发服务器端的事件.举个简单的例子,如:一个注册页面,我们填写完注册信息之后,如果按F5刷新之后,会自动触发到Button事件上,这样就造成了又注册了一次的麻烦. 我先前的解决方案:用关键字查询,如有相同,则提示已有此用户. 但是这种方案不能在没有表识的情况下使用,他会重新提交.鉴于此,我寻找了一种新的解决方案,很庆幸,在朋友的提点下,迸发了这样的解决方案,肯定有更好的解决方案,不吝赐教. 解决思路:刷新时,捕捉KeyPress,让他触发其他无用的事件.

JS阻止冒泡事件以及默认事件发生的简单方法

 这篇文章主要介绍了JS阻止冒泡事件以及默认事件发生的简单方法,有需要的朋友可以参考一下 如果<p>是在<div>里面,那么呢,<P>有一个onclick事件,<div>也有onclick事件,为了触发<P>的点击事件时,不触发父元素的点击事件,那么就需要调用如下函数:    代码如下: function stopBubble(e){   if(e&&e.stopPropagation){//非IE    e.stopPropag

富文本带点击事件的解决方案

富文本带点击事件的解决方案   效果   分析 富文本中要添加点击link事件,需要深入到CoreText里面才能够解决,本人将TTTAttributedLabel进行了封装(封装并不完全,以后会继续完善),简化了操作.   源码 https://github.com/YouXianMing/UI-Component-Collection https://github.com/TTTAttributedLabel/TTTAttributedLabel // // TTTAttributeLabe

阻止JavaScript事件冒泡传递(cancelBubble 、stopPropagation)_javascript技巧

cancelBubble在IE下有效 stopPropagation在Firefox下有效 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  <html xmlns="http://www.w3.org/1999/xhtml

阻止事件冒泡,阻止默认事件,event.stopPropagation()和event.preventDefault(),return fal的区别

今天来看看前端的冒泡和事件默认事件如何处理 1.event.stopPropagation()方法 这是阻止事件的冒泡方法,不让事件向documen上蔓延,但是默认事件任然会执行,当你掉用这个方法的时候,如果点击一个连接,这个连接仍然会被打开, 2.event.preventDefault()方法 这是阻止默认事件的方法,调用此方法是,连接不会被打开,但是会发生冒泡,冒泡会传递到上一层的父元素: 3.return false  : 这个方法比较暴力,他会同事阻止事件冒泡也会阻止默认事件:写上此代

jQuery中阻止冒泡事件的方法介绍_jquery

一.冒泡事件简介 当我们点击一个控件的时候,如果包括这个控件的父控件也有click事件,则会继续执行.比如:div下的a都有click事件,点击a的时候,会alert出现2次.这个现象叫做冒泡事件. 这个事件从原始元素开始一直冒泡到DOM树的最上层.目标元素: 任何一个事件的目标元素都是最开始的那个元素,在我们的这个例子中也就是按钮,并且它在我们的元素对象中以属性的形式出现.使用事件代理的话我们可以把事 件处理器添加到一个元素上,等待一个事件从它的子级元素里冒泡上来,并且可以很方便地得知这个事件