iis中定时器失效

zh301127 2010-12-30 10:22:39
我是在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设置中的,空闲多少时间关闭工作进程给勾掉了,这样倒是可以计时了,但是过不了多久,就出现网站不能访问了,需要重启服务器才行。。。

小弟为这个东西弄得快崩溃了。。。不知如何解决,请各位哥哥帮帮忙
...全文
633 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
zh301127 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 chengfellow 的回复:]
一般而言,定义成静态对象,是不会被回收的
static JobScheduleService jss = null;
protected void Application_Start(object sender, EventArgs e) {
Logging.Init();
Logging.WriteLog("System start at:" + DateTime.Now.ToS……
[/Quote]

还有,我的程序中没在Application_Start中写东西,我记录过日志,发现。。很久不访问,会掉用Application_End,然后,再一次访问,会再次调用Application_Start。。
zh301127 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 chengfellow 的回复:]
一般而言,定义成静态对象,是不会被回收的
static JobScheduleService jss = null;
protected void Application_Start(object sender, EventArgs e) {
Logging.Init();
Logging.WriteLog("System start at:" + DateTime.Now.ToS……
[/Quote]

谢谢大侠。。我去试试这种方法,我用过模拟访问网页的方法,但是没有实现。。。

在global类中的List 是静态的

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

但是,在globalTimer中,添加的都是局部变量。。。不知道这样会不会有什么影响,引用了这个局部变量而不会给回收吗?
chengfellow 2010-12-30
  • 打赏
  • 举报
回复
一般而言,定义成静态对象,是不会被回收的
static JobScheduleService jss = null;
protected void Application_Start(object sender, EventArgs e) {
Logging.Init();
Logging.WriteLog("System start at:" + DateTime.Now.ToString());
jss = new JobScheduleService();
}
chengfellow 2010-12-30
  • 打赏
  • 举报
回复
zh301127 2010-12-30
  • 打赏
  • 举报
回复
那该怎么弄呢?我这个的要求是每添加一个“事件”,就要有一个定时器来监视这个事件状态,所以不同于每天定时执行的。。。所以有点搞不懂。
chen_ya_ping 2010-12-30
  • 打赏
  • 举报
回复
我觉得楼主的太烦了吧。没有必要这样做啊。
whycom 2010-12-30
  • 打赏
  • 举报
回复
b/s不要这样用
zh301127 2010-12-30
  • 打赏
  • 举报
回复
是不是我程序写的有问题呢?
gengchenhui 2010-12-30
  • 打赏
  • 举报
回复
我的解决方案就是一个类的静态字段,存储你想要的东西,然后一个Timer去定时更新,如果没有收到数据,就不更新这个静态字段。
zh301127 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wuyq11 的回复:]

建立一个新的应用程序池,将网站单独指向新建立的这个应用程序池下。
不要与别的网站共用应用程序池。
配置文件被更改会导致应用程序重启的
试试
void Application_Start(object sender, EventArgs e)
{
System.Timers.Timer t= new System.Timers.Timer();
t.Interv……
[/Quote]

默认的应用程序池只有一个默认网站,没用的。。而且里面也没设置,都是默认的,昨天设置了一下“空闲多少时间终止工作进程”,可以正常计时了,但是过不了多久就出现无法访问的情况了
zh301127 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 gengchenhui 的回复:]

sp说的都是实际开发中应该注意的,如果楼主只是要结果,不是实际开发,或者只是小作坊公司,交上任务就行的话(总之不是避免被sp一样的头儿骂的话)加上这一句:GC.KeepAlive(aTimer),呵呵,就是不让GC回收你的这个Timer。
[/Quote]

什么都算不上啊。。。我也是初学者,就两个人搞这个东西,另外一个什么也不懂。如果加上GC.KeepAlive(aTimer),会不会出现网站不能访问的情况呢?我昨天把IIS的一个选项“空闲多少时间关闭工作进程”(默认20分钟)给勾掉了,倒是可以正常计时了,但是隔不了多久网站就不能访问了,要重启IIS才可以。

还有,请问一下,我的timer都是被add在Global的静态List中的,,,回收是不是把我的List中的给清除了?不是只要有引用,就不会给回收掉啊?还是把全部都给回收掉了。

还有,我觉得我这个垃圾回收和IIS的工作进程关闭好像不是一个概念,还有IIS里面也有一个回收时间设置(默认高达29小时),不知道这些有什么差别。。。

Application_End调用后,是静态的变量也会清除吗?。。

唉,问题有点多,周围没人请教,都没人弄过这个
zh301127 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 sp1234 的回复:]

引用 5 楼 zh301127 的回复:

那该怎么弄呢?我这个的要求是每添加一个“事件”,就要有一个定时器来监视这个事件状态,所以不同于每天定时执行的。。。所以有点搞不懂。


事件还用定时器“监视”?你再注册一个处理程序,那么事件触发时不就通知到你的监视程序了嘛!


asp.net程序只是IIS下边一个傀儡,受它的体系和自我维护原则影响无法保证定时任务,定时任务需要开发wi……
[/Quote]

sp大大说的都是良言。。。这里说的“事件”是我网站的一个东西,不是编程的那个事件,就是添加了一条事件后,如果多少时间没处理,事件就自动升级,然后发短信和邮件给相对应的人员。。。恼火的是我在XP下都可以,但是到了他们服务器那边就出问题。
gengchenhui 2010-12-30
  • 打赏
  • 举报
回复
sp说的都是实际开发中应该注意的,如果楼主只是要结果,不是实际开发,或者只是小作坊公司,交上任务就行的话(总之不是避免被sp一样的头儿骂的话)加上这一句:GC.KeepAlive(aTimer),呵呵,就是不让GC回收你的这个Timer。
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zh301127 的回复:]

那该怎么弄呢?我这个的要求是每添加一个“事件”,就要有一个定时器来监视这个事件状态,所以不同于每天定时执行的。。。所以有点搞不懂。
[/Quote]

事件还用定时器“监视”?你再注册一个处理程序,那么事件触发时不就通知到你的监视程序了嘛!


asp.net程序只是IIS下边一个傀儡,受它的体系和自我维护原则影响无法保证定时任务,定时任务需要开发windows service。
  • 打赏
  • 举报
回复
当你测试asp.net应用程序时,要专门多次测试“每隔1、2分钟asp.net程序就会重启”的现象,看看这种情况下你的asp.net程序能不能给用户一个连续的、看不出来服务器端程序重启了的操作体验。如果多种方式都无法解决bug,那么就认定自己需要根本就从设计原则上改弦易辙,不要把问题总是归咎于外部。
  • 打赏
  • 举报
回复
iis和asp.net重启asp.net应用程序,这是为了维护,为了你的网站能免维护而挺过例如过年之类的高峰期。做asp.net应用程序,你要刻意地去测试(例如手动更新一下web.config文件然后保存)应用程序重启现象,会测试才会编程。

注意,我说的会测试,不是指调试,是会设计测试用例。你会测试,就能把外界对你的干扰、错误的demo程序,大部分都立刻挑出来,省得人云亦云状态下编程。


回到你的问题:IIS和你的asp.net解决不了这个问题,你不能让它们遇到内部严重错误的时候不进行自我维护吧?!
wuyq11 2010-12-30
  • 打赏
  • 举报
回复
建立一个新的应用程序池,将网站单独指向新建立的这个应用程序池下。
不要与别的网站共用应用程序池。
配置文件被更改会导致应用程序重启的
试试
void Application_Start(object sender, EventArgs e)
{
System.Timers.Timer t= new System.Timers.Timer();
t.Interval = 1000;
t.Enabled = true;
}

void Application_End(object sender, EventArgs e)
{
Thread.Sleep(1000);
}
private static void OnTimedEvent(object source, System.Timers.ElapsedEventArgs e)
{}

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧