ASP.NET定时器问题 急!!!

比尔咔咔 2006-06-26 06:14:54
在IHttpModule中定义 Timer
但是老是被自动GC回收掉。。。
请问有什么办法避免 当前对象被回收 (24小时运行 不需要它回收...)

public class SetTime : IHttpModule
{
private static Timer statsTimer;

/// <summary>
/// RunTimePointMin
/// 最小时间和最大时间之间的间隔不能大于定时间隔的2倍
/// </summary>
private DateTime RunTimePointMin;

/// <summary>
/// RunTimePointMax
/// </summary>
private DateTime RunTimePointMax;


// 定时间隔
/// <summary>
/// StatsInterval
/// 建议60秒刷新一次 60000
/// </summary>
private long StatsInterval;

public String ModuleName
{
get { return ""; }
}


// *********************************************************************
// ForumsHttpModule
//
/**/
/// <summary>
/// Initializes the HttpModule and performs the wireup of all application
/// events.
/// </summary>
/// <param name="application">Application the module is being run for</param>
public void Init(HttpApplication application)
{

// Wire-up application events
// 得到Web.Config中的关于
this.StatsInterval = Convert.ToInt64(ConfigurationSettings.AppSettings["StatsInterval"]);
this.RunTimePointMin = Convert.ToDateTime(ConfigurationSettings.AppSettings["RunTimePointMin"]);
this.RunTimePointMax = Convert.ToDateTime(ConfigurationSettings.AppSettings["RunTimePointMax"]);
string aa = ConfigurationSettings.AppSettings["ser"];
Log.Add("1", aa + " Init " + RunTimePointMin.ToString("yyyy-MM-dd HH:mm:ss") + "," + RunTimePointMax.ToString("yyyy-MM-dd HH:mm:ss"));
// 如果使用定时器并且定时器还没初始化

if (statsTimer == null)
{
statsTimer = new Timer(new TimerCallback(EmailCallbackStatsInterval), application.Context, StatsInterval, StatsInterval);


}
}

/**/
/// <summary>
/// 释放定时器
///
/// </summary>
public void Dispose()
{
GC.SuppressFinalize(this);
}

/**/
/// <summary>
/// 定时索引帖子和定时更新论坛统计信息
/// </summary>
private void EmailCallbackStatsInterval(object sender)
{
this.StatsInterval = Convert.ToInt64(ConfigurationSettings.AppSettings["StatsInterval"]);
this.RunTimePointMin = Convert.ToDateTime(ConfigurationSettings.AppSettings["RunTimePointMin"]);
this.RunTimePointMax = Convert.ToDateTime(ConfigurationSettings.AppSettings["RunTimePointMax"]);
string aa = ConfigurationSettings.AppSettings["ser"];
try
{
Log.Add("4", aa + "reflash " + RunTimePointMin.ToString("yyyy-MM-dd HH:mm:ss") + "," + RunTimePointMax.ToString("yyyy-MM-dd HH:mm:ss"));

if (DateTime.Now.Hour * 100 + DateTime.Now.Minute < this.RunTimePointMax.Hour * 100 + this.RunTimePointMax.Minute && this.RunTimePointMin.Hour * 100 + this.RunTimePointMin.Minute < DateTime.Now.Hour * 100 + DateTime.Now.Minute)
{
// 休眠定时器
statsTimer.Change( System.Threading.Timeout.Infinite, StatsInterval );
//处理内容
..


}
}

Log.Add("1", aa + " End night batch");
// 发送Email


}

}
catch (Exception e)
{
Log.Add("1", aa + " " + e.Message);
throw e;
}
finally
{
// 唤醒定时器
statsTimer.Change( StatsInterval, StatsInterval);
}
}
...全文
784 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccwq 2006-06-29
  • 打赏
  • 举报
回复
UP
amandag 2006-06-27
  • 打赏
  • 举报
回复
up
CH_MARS 2006-06-27
  • 打赏
  • 举报
回复
蹭分中。。。
比尔咔咔 2006-06-27
  • 打赏
  • 举报
回复
谢谢大家,我尝试下,马上结帖.
ccwq 2006-06-27
  • 打赏
  • 举报
回复
关注楼主的TEST进展
cat_hsfz 2006-06-26
  • 打赏
  • 举报
回复
我也遇到了这样的问题。我是直接模仿CommunityServer的Job来做的,但由于Timer总是被自动回收(就如Session丢失问题一样),所以结果总是做不成功。通过请求避免工作进程停止好像也不行,至少我保持手动每3秒刷新一次,大概每一分钟还是回收一次。

其实不是不想做成Windows Service,但就像模拟CommunityServer那种Job的效果,那样才方便部署。

Session丢失可以把Session托管给StateServer服务,如果ASP.NET增加一个JobServer用于托管Job就好了。
孟子E章 2006-06-26
  • 打赏
  • 举报
回复
你可以避免这种情况:
在你的Timer里执行一个请求页面的一个操作,因为asp.net 如果没人访问,工作进程就停止了,用程序不停地访问页面,可以避免
szc21 2006-06-26
  • 打赏
  • 举报
回复
up
Ivony 2006-06-26
  • 打赏
  • 举报
回复
哪里是被GC回收掉了,是IIS把你的进程回收了。ASP.NET的进程本来就是不稳定的,做成Windows Service。
movingboy2 2006-06-26
  • 打赏
  • 举报
回复
我也建议写个Windows Service拉倒,这个东西要工作稳定可靠啊
ivee 2006-06-26
  • 打赏
  • 举报
回复
ASP.net就不要搞什么定时器了,就不是用来干这个的。
写一个Windows Service,代码比你这个还简单。
还有更简单的办法,你在SQL Server里定义一个Job,然后启动SQL Agent,如果你用的数据库是SQL Server的话。
winner2050 2006-06-26
  • 打赏
  • 举报
回复
正好我要做个定时采集文章的功能

up
ccwq 2006-06-26
  • 打赏
  • 举报
回复
最好还是在Application里定义定时器,
先给你一篇孟子老大的大作给你参考下,如果还是不清楚的话,麻烦你把你自己的代码整理的清晰点,那样子看的好累
http://blog.csdn.net/net_lover/archive/2003/08/27/6943.aspx
amandag 2006-06-26
  • 打赏
  • 举报
回复
up
jecray 2006-06-26
  • 打赏
  • 举报
回复
不懂啊,关注。
比尔咔咔 2006-06-26
  • 打赏
  • 举报
回复
大家帮帮忙了 。
MSDN文档实在是没找到相关的.

62,046

社区成员

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

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

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

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