IIS定时器失效

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IIS定时器失效相关的知识,希望对你有一定的参考价值。

我是在Global类中有一个List<TaskTimer> T,TaskTimer是继承于Timer类,在业务层有些函数来加入定时器

TaskTimer t=new TaskTimer();
...
T.add(t);

这样来定时执行,我想如果有对t的引用,那么就不会被回收掉吧?

在vs2005中运行的时候一点问题也没得,在iis5.0下也没得问题

可是一挂到IIS6.0上就出现问题了,我看了一下,在挂上去1个小时左右,就会调用Application_end。。。之后T数目为0了。。。

网上查了说是回收了,也做了一个自己访问自己网页的办法,但是不行。。。

后来我把IIS设置中的,空闲多少时间关闭工作进程给勾掉了,这样倒是可以计时了,但是过不了多久,就出现网站不能访问了,需要重启服务器才行。。。

小弟为这个东西弄得快崩溃了。。。不知如何解决
在global类中的List 是静态的

public static System.Collections.Generic.List<TaskTimer> globalTimer;

zwsh_0大大没听懂我的意思,我是在Global类中定义了一个List,静态的;然后把我的定时器add到这个LIst中去,但是挂到IIS上的时候,出现了无法计时的情况,网上说是由于回收的情况。。。但是我还是没解决

朋友,首先根据你的问题,可以肯定是资源被回收造成的。
“我是在Global类中定义了一个List,静态的”
--------估计你是把Web和Form搞混了,以为静态的对象就不会被回收了。在Form中只要你没关程序,那这个进程域就一直存在,而域中的静态对象也会一直保留;而在Web中,所谓定时回收是指直接清理进程占用资源然后将此进程kill掉,所以进程都没了,那个对象以及Global对象自然也早被回收了。
“但是过不了多久,就出现网站不能访问了,需要重启服务器才行”
--------千万不要勾掉那个框,除非你对IIS进程做了全面的自定义清理工作,具体方法可以参照MSDN。

根据你的描述,我估计你是想做一个任务定时执行器,由于IIS的先天不足(实例的不确定性),所以依靠IIS去做这个思路本身就欠妥。
我的建议是将这个任务放到数据库的作业中去,或者单另做一个Console小程序,然后用数据库作业或者Windows的“任务计划程序”去执行。
这两种方式不但比IIS要可靠得多,而且他们都提供了强大的事件处理、异常通知、以及二次扩展的功能,绝对能够胜任你的需求。
参考技术A -----------------------------分析
“空闲多少时间关闭工作进程给勾掉了”
服务器运行进程最好不要关闭,这些进程是服务器应用池的和硬件配置的相关进程,如果关闭进程应用池将不能正常运行服务器,应用池的设置保持默认就好,或者设置应用池配置时不要盲目把配置值调的很高。应用池一般支持进程默认是5个。
Application_end是停止服务的系统对象。

IIS6.0 和iis5.0 基本运行是一样,但IIS6.0是添加一些安全补丁,像你这种情况在iis5.1也有,global 统计人数也是0,但有关解决方法和代码无关,多注意配置IiS设置也许能够解决,我就是这样解决的,很久的事了不记得具体操作。
参考技术B 弄成静态的。
Application_end 调试一下,看看什么原因导致方法执行的。
参考技术C 一个定时器不就够了 你怎么弄那么多的定时器,估计就是定时器过多把iis弄挂了 参考技术D 将这个任务放到数据库的作业中去,或者单另做一个Console小程序,然后用数据库作业本回答被提问者采纳

以上是关于IIS定时器失效的主要内容,如果未能解决你的问题,请参考以下文章

iOS - scrollView与NSTimer的失效问题详解

vue keep-alive中页面缓存后destroyed失效-如何关闭定时器

Quartz定时任务和IIS程序池闲置超时时间冲突解决方案

定时Job在IIS中潜在危险-IIS 定期回收

WIN10定时关机失效?

react-native android模拟器或真机上定时器setInterval和setTimeout失效