我有一个Timer函数,我从global.asax的Application_Start调用它
这是课程:
public class AlertTimer
{
public AlertTimer()
{
//
// TODO: Add constructor logic here
//
}
static System.Timers.Timer aTimer = new System.Timers.Timer();
public static void Start()
{
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
aTimer.Interval = 30000;
aTimer.Enabled = true;
GC.KeepAlive(aTimer);
}
public static void OnTimedEvent(object source, ElapsedEventArgs e)
{
PresenceService ps = new PresenceService();
ps.GetAbsenceContacts(); //takes 10 seconds
}
}
现在,我的问题是在运行计时器完成后,此类类
PresenceService ps = new PresenceService();
是否变得干净,或者GC将其保留在内存中,并在每次OnTimedEvent运行时启动一个新类。谢谢!
结论:从代码中删除GC。天哪!
最佳答案
现在,我的问题是此类是否为PresenceService ps = new
PresenceService();计时器运行完毕后变得干净了,
或GC正在将其保存在内存中,并且每次都启动一个新的
运行OnTimedEvent。
是。
PresenceService实例将离开作用域,因此将受到垃圾回收。但是,由于GC大多是不确定性的,因此它仍在内存中,直到被回收为止。因此,在做事并具有生命周期的对象(例如计时器)上,最好调用某种类型的“关闭”方法。
但是,我有一个更大的问题,就是为什么您要在Web应用程序中运行计时器,以及为什么感觉到需要直接在垃圾收集器上调用任何方法。通常,这表明您的应用程序存在问题。