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);
}
}