2015-05-07 84 views
0

當我打開Cellule.cs類時,會創建一個計時器,當Cellule.cs關閉時,計時器仍會調用表單。計時器不會收集垃圾

我該如何有效地處置它。這會導致一個問題,因爲表單Cellules.Cs經常打開,並且每次調用TimeHasChanged()都會對數據庫進行一次調用;

我已經嘗試在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"; 
    } 
} 
+0

代碼不能編譯:'BTimer'沒有實現' IDisposable' – Blorgbeard

+0

@Blorgbeard對不起,我刪除它,這是從我最後一次嘗試解決它 – Insecurefarm

回答

1

如果一個類包含一個成員是一次性該類應該實現IDisposable以及

注:BTimer需要實現IDisposable。

class Cellules : IDisposable 
{ 
    BTimer timer // disposable member 

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

} 

然後當然,當你調用來完成響應處置上Cellules

的任何實例您的編輯

要實現對BTimer類的IDisposable的

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

........  

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

} 

}

我會添加的是一個停止方法的BTimer,所以你不需要處置停止計時器。

+0

這是從我最後一次嘗試解決它,我編輯後發表遺憾 – Insecurefarm

0

您的BTimer尚未實現IDisposable,您必須註銷您的TheTimeChanged事件後,您不再需要它。

2

需要實現IDisposable,並在Dispose方法,你需要Dispose定時器,而不是僅僅將其設置爲空`。

你或許應該撇清任何事件形成的計時器以及(儘管這可能是不必要的,如果計時器的Dispose方法做到這一點):

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