计时器不会收集垃圾

时间:2015-05-07 19:48:01

标签: c# timer garbage-collection

当我打开类Cellule.cs时,会创建一个计时器,当Cellule.cs关闭时,计时器仍会调用表单。

如何有效地处理它。这会导致问题,因为Cellules.Cs形式经常打开,并且每次TimeHasChanged()都会对DB进行一次调用;

我已经尝试在Btimer中添加Dispose()方法并将计时器设置为null但它不能解决问题。

private BTimer timer;

public Cellules()
{
   timer = new BTimer(30000);
   timer.TheTimeChanged += TimeHasChanged;
}

    protected void TimeHasChanged()
    {
        controller.UpdateTimeMesPieces();
        lblTime.Text = controller.UpdateTimeClock();
    }

继续计时器

public class BTimer
{
    private string theTime;
    private Timer timer;

    public BTimer(int interval)
    {
        timer = new Timer();
        timer.Tick += new EventHandler(Timer_Tick);
        timer.Interval = interval;
        timer.Start();
    }

    public delegate void TimerTickHandler();

    public event TimerTickHandler TheTimeChanged;

    public string TheTime
    {
        get
        {
            return theTime;
        }
        set
        {
            theTime = value;
            OnTheTimeChanged();

        }
    }

    protected void OnTheTimeChanged()
    {
        if (TheTimeChanged != null)
        {
            TheTimeChanged();
        }
    }

    private void Timer_Tick(object sender, EventArgs e)
    {
        TheTime = "Bing";
    }
}

3 个答案:

答案 0 :(得分:2)

需要实现IDisposable,并且在Dispose方法中需要Dispose计时器,而不是将其设置为“null”。 / p>

您可能也应该将计时器中的任何事件取消关联(尽管如果计时器的Dispose方法执行此操作,这可能是不必要的):

timer.Tick -= Timer_Tick;
timer.Dispose();

答案 1 :(得分:1)

如果一个类包含一个可以使用的成员,那么该类也应该实现IDisposable

注意:BTimer需要实现IDisposable。

class Cellules : IDisposable
{
   BTimer timer // disposable member

   public void Dispose() // implementing IDisposable
   {
        timer.Dispose();
   }

}

当然,当你完成后,在任何Cellules实例上调用Dispose

回应您的编辑

你想在BTimer类上实现IDisposable

public class BTimer : IDisposable
{
private string theTime;
private Timer timer; 

 ........     

void Dispose()
{
    timer.Stop();
     timer.Dispose();

}

}

我要添加的是BTimer的Stop方法,因此您不需要处理以停止计时器。

答案 2 :(得分:0)

您的BTimer尚未实施IDisposable,您必须在不再需要之后取消注册TheTimeChanged活动。