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

  1. private const string DummyPageUrl = "http:/index.aspx";
  2. private const string DummyCacheItemKey = "GagaGuguGigi";
  3. Quartz.IScheduler sched = SingletonScheduler.GetIntance();
  4. void Application_Start(object sender, EventArgs e)
  5. {
  6. //缓存页面
  7. RegisterCacheEntry();
  8. }
  9. // 注册一缓存条目在5分钟内到期,到期后触发的调事件
  10. private void RegisterCacheEntry()
  11. {
  12. if (null != HttpContext.Current.Cache[DummyCacheItemKey]) return;
  13. HttpContext.Current.Cache.Add(DummyCacheItemKey, "Test", null, DateTime.MaxValue,
  14. TimeSpan.FromMinutes(5), CacheItemPriority.NotRemovable,
  15. new CacheItemRemovedCallback(CacheItemRemovedCallback));
  16. }
  17. // 缓存项过期时程序模拟点击页面,阻止应用程序结束
  18. public void CacheItemRemovedCallback(string key, object value, CacheItemRemovedReason reason)
  19. {
  20. HitPage();
  21. }
  22. // 模拟点击网站网页
  23. private void HitPage()
  24. {
  25. System.Net.WebClient client = new System.Net.WebClient();
  26. client.DownloadData(DummyPageUrl);
  27. }
  28. protected void Application_BeginRequest(Object sender, EventArgs e)
  29. {
  30. if (HttpContext.Current.Request.Url.ToString() == DummyPageUrl)
  31. {
  32. RegisterCacheEntry();
  33. }
  34. }

这样,网站应用程序就可以像运行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

-----------------------------------------

设计IIS的解决方法

1.长期无用户访问网页,asp.net 会自动进入Application_End事件(时间长短可以配置IIS) 
2.修改web.config文件
3.删除该站点下的文件夹之后,会自动进入Application_End
4.修改了bin目录下的文件
5.重启IIS

以上几条都会触发Application_End事件,如果你在asp.net的Application_State事件里做了一下应用(比如说定时器的计划任务)Application_End事件可能会使定时器停止。想要避免这种情况的发送就要注意要上面的几个条件和修改IIS设置了。

IIS7  上可以通过设置应用程序池参数使其不会被简单的自动回收来避免触发Application_End事件。

在IIS中找到这个站点所用的程序池,点击“高级设置...” 在打开的列表中更改以下设置: 
回收——固定时间间隔(分钟) 改为 0         
 ——虚拟/专用内存限制(KB) 改为 0 
进程模型——闲置超时(分钟) 改为 0

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

  1. 【移动端debug-4】iOS下setTimeout无法触发focus事件的解决方案

    开篇总结:其实目前无法解决这个bug. 这两天做项目遇到了这个case,项目需求是打开页面的时候,input元素自动弹起键盘.由于各种方面的考虑,我们希望通过setTimeout延时200毫秒让inp ...

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

    如果<p>是在<div>里面,那么呢,<P>有一个onclick事件,<div>也有onclick事件,为了触发<P>的点击事件时,不触发父 ...

  3. 阻止默认事件event.preventDefault();

    阻止浏览器默认事件.什么是默认事件,例如浏览器默认右键菜单.a标签默认连接跳转...,如何阻止呢? Firefox中,event必须作为参数传入.  IE中,event是window对象的属性. ev ...

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

    今天来看看前端的冒泡和事件默认事件如何处理 1.event.stopPropagation()方法 这是阻止事件的冒泡方法,不让事件向documen上蔓延,但是默认事件任然会执行,当你掉用这个方法的时 ...

  5. jquery阻止冒泡事件行为发生

    <div onclick="a()"> <p onclick="b()"></p> </div> div和p元素 ...

  6. JQuery阻止冒泡事件on绑定中异常情况分析

    科普下事件冒泡以及默认行为,以下面例子举列子:     事件冒泡:当点击内部button元素时,会触发自身及外层 a的点击事件,这就是事件冒泡引起的.事件会随着 DOM 的层次结构依次向上传播. 事件 ...

  7. s事件之event.preventDefault()与event.stopPropagation()的阻止默认事件和阻止事件冒泡的用法

    event.preventDefault()用法介绍 该方法将通知 Web 浏览器不要执行与事件关联的默认动作(如果存在这样的动作).例如,如果 type 属性是 "submit" ...

  8. js之阻止事件冒泡(待修改)和阻止默认事件

    阻止默认事件(event.stopPropagation()): <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional// ...

  9. jquery easyui textbox onblur事件,textbox blur事件无效解决方案

    jquery easyui textbox onblur事件,textbox blur事件无效解决方案 >>>>>>>>>>>> ...

随机推荐

  1. 数据库之mysql

    安装mysql-server时连同客户端与perl环境一起安装了 centos6.5安装mysql[root@localhost ~]# yum install mysql-server Instal ...

  2. linux概念之性能调优

    目前,对系统进行性能调试的工具有很多,这些可以两大类:一类是标准的分析工具,即所有的UNIX都会带的分析工具: 另一类是不同厂商的UNIX所特有的性能分析工具,比如HP-UX就有自己的增值性能分析工具 ...

  3. Linux-LNMP LAMP LNMPA

    这个脚本是使用shell编写,为了快速在生产环境上部署lnmp/lamp/lnmpa(Linux.Nginx/Tengine.MySQL/MariaDB/Percona.PHP),适用于CentOS ...

  4. VB的if和elseif

    VB中if和elseif的用法是: if...then...elseif...then...else...endif 切记在then的后面不要加冒号,加了冒号出现else没有if的错误,因为加了冒号表 ...

  5. python批量制作雷达图

    老板要画雷达图,但是数据好多组怎么办?不能一个一个点excel去画吧,那么可以利用python进行批量制作,得到样式如下: 首先制作一个演示的excel,评分为excel随机数生成: 1 =INT(( ...

  6. xml学习笔记二(规则)

    XML 的语法规则很简单,且很有逻辑.这些规则很容易学习,也很容易使用. 所有 XML 元素都须有关闭标签 在 HTML,经常会看到没有关闭标签的元素: <p>This is a para ...

  7. Saiku OLAP

    简介 Saiku成立于2008年,由Tom Barber和Paul Stoellberger研发.最初叫做Pentaho分析工具,起初是基于OLAP4J库用GWT包装的一个前端分析工具.经过多年的演化 ...

  8. Javascript 错误捕获

    一.一般写JS代码很少捕获异常,建议捕获异常,具体代码如下: 1.写法一: try { //具体代码 } catch(error) { alert("Error:" + error ...

  9. paypal接口对接注意事项

    追加:新的设定画面 在paypal对接过程中,会存在return_url和notify两种 分别用pdt和ipn实现 但是对于paypal,大家请注意,真实环境和沙盒测试环境的区别 你可以到www.p ...

  10. 概要设计、详细设计(三)关键点(Know-How)、运用技巧

    1.    关键点(Know-How).运用技巧 4.1 设计准则 制定设计准则是概要设计阶段的最主要.最关键的工作.在实际工作中往往忽略,多数项目牺牲在这个环节.制定设计准则着眼于如何更好的做设计, ...