我有一个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应用程序中运行计时器,以及为什么感觉到需要直接在垃圾收集器上调用任何方法。通常,这表明您的应用程序存在问题。

08-25 01:57