日期:2014-05-20  浏览次数:21033 次

如何延长web应用程序的存活时间,以保证httpmodule里定时任务能一直执行
在httpmodule里写了一段代码,主要是通过timer定时执行任务。

如果页面长时间没人访问了,web应用程序被回收了,这个定时执行的任务就挂掉了。

有没有办法能将这个回收的时间延长,比如说调成24小时?以保证web定时任务的执行。

------解决方案--------------------
探讨
我也正在寻找同样问题的答案,我现在就是使用windowservice来做的。但是有个问题,如果我要定期更新一些静态变量呢?windowservice好像就不大好实现了,毕竟不是不同的内存空间,那该怎么办呢?

------解决方案--------------------
对于定时执行任务之类的,最好不要放在web程序里,那是很糟糕的事情,因为这样会占用资源,iis为什么会要去回收?就是了尽可能减少没用的资源。提供更多的资源给外部访问线程。
------解决方案--------------------
你这样设计绝对使不合理的,在httpModule里设置定时器,那么每一个web请求,都要通过Module,难道都要挂起24小时,这样没几个请求你的服务器就挂了。。这样太浪费资源了。。 你可以采用其它方式实现啊,比如Winservice定时调用你网站的webservice来实现
------解决方案--------------------
探讨
很奇怪,你的timer为什么要放在httpmodule里?你就放在某个程序模块了就可以了啊
把你的timer声明称 readonly static timer = new Timer();
看看是否会被垃圾回收器回收掉?
我记得这样是不会被回收的,因为我写的cachemanager就是这么做的,cache后台会有个timer去不停的看cacheitem是否失效,失效了就清除掉。

------解决方案--------------------
lz的专研精神让人佩服,但很明显的是方向上出了点问题

asp.net和基于iis和http协议的,那么其受iis应用程序池的控制,受http这个无连接协议的控制

如果单纯考虑http协议,http是无连接滴,又不能时时刻刻保证有人访问,那么可能的解决方法是 新开一个线程,然后在这个新线程的里去做你要做的事情,就能很好解决你最早的那个time out问题

但是asp.net同时受iis管控,asp.net的执行实际是在iis程序池里管控滴,相当于是应用程序池进程下的某个线程
而应用程序池是定时重启滴,不知道你观察过iis和进程的关系没有,如果有人访问某个站,iis会启动w3wp.exe去开启一个新的进程,同时去启动某个线程,并在线程里运行该站的实际代码。如果你仔细观察一下回收应用程序池时的进程状态,你回发现,在那一瞬间实际iis是重启开启了一个新的w3wp.exe进程,然后关闭原来w3wp.exe进程。现在就能很好解释你后面那个readonly的问题了,进程都已经变了,你认为那个readonly 还能起效吗?


所以:你实际要选择的事情是 
1.要能脱离http无状态的限制,保证你时时刻刻运行
2.要能脱离iis管控,一直保持自己的进程

呵呵,再看这两个要求不是window serviecs是啥??