2012-04-18 94 views
0

通常,垃圾收集是一種很好的做法,因爲它可以釋放資源。 如何在下面的代碼的keepingTime方法中實現正確的垃圾回收?或者,事實上,我甚至需要?!垃圾收集 - 是否需要?

System.Timers.Timer允許IDisposable接口,所以'using'是一個選項,但不在下面,因爲定時器的範圍需要擴展到訂閱Timer Elapsed事件的方法myTimer_Elapsed。我已經做了兩次垃圾收集嘗試,但都失敗了,因爲定時器沒有足夠長的時間!

我以前dicussed這段代碼,其他原因,在HERE

public partial class AirportParking : Form 
{ 

    //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
    //instance variables of the form 
    System.Timers.Timer myTimer; 

    private const string EvenText = "hello"; 
    private const string OddText = "hello world"; 

    static int tickLength = 100; 
    static int elapsedCounter; 
    private int MaxTime = 5000; 
    private TimeSpan elapsedTime; 
    private readonly DateTime startTime = DateTime.Now; 
    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 


    public AirportParking() 
    { 
     InitializeComponent(); 
     lblValue.Text = EvenText; 
     keepingTime(); 
    } 

    //method for keeping time 
    public void keepingTime() { 

     myTimer = new System.Timers.Timer(tickLength); 
     myTimer.Elapsed += new ElapsedEventHandler(myTimer_Elapsed); 
     myTimer.AutoReset = true; 
     myTimer.Enabled = true; 
     myTimer.Start(); 

     //ATTEMPT_1.tried the following unsuccessfully 
     //using (System.Timers.Timer myTimer = new System.Timers.Timer(tickLength)) 
     //{ 
     // myTimer.Elapsed += new ElapsedEventHandler(myTimer_Elapsed); 
     // myTimer.AutoReset = true; 
     // myTimer.Enabled = true; 
     // myTimer.Start(); 
     //} 

     //ATTEMPT_2.tried the following unsuccessfully 
     //myTimer.Elapsed += new ElapsedEventHandler(myTimer_Elapsed); 
     //myTimer.AutoReset = true; 
     //myTimer.Enabled = true;   
     //try 
     //{ 
     // myTimer.Start(); 
     //} 
     //finally 
     //{ 
     // myTimer.Dispose(); 
     //} 

    } 

    private void myTimer_Elapsed(Object myObject,EventArgs myEventArgs){ 

     elapsedCounter++; 
     elapsedTime = DateTime.Now.Subtract(startTime); 

     if (elapsedTime.TotalMilliseconds < MaxTime) 
     { 
      this.BeginInvoke(new MethodInvoker(delegate 
      { 
       this.lblElapsedTime.Text = elapsedTime.ToString(); 

       if (elapsedCounter % 2 == 0) 
        this.lblValue.Text = EvenText; 
       else 
        this.lblValue.Text = OddText; 
      })); 
     } 
     else {myTimer.Stop();} 
    } 
} 
+3

而你描述的不是一個garbadge集合。 IDisposable與GC無關。 – Euphoric 2012-04-18 07:23:02

回答

1

您想要處理定時器資源的唯一地方是在回調函數myTimer_Elapsed中。你在哪裏做myTime.Stop();你也可以做myTimer.Dispose();

但是,當應用程序的這部分超出範圍時,無論如何將清理所有這些變量。只要定時器最終停止,一旦它被解除引用,它就會被GC收集。

using塊(和您當前的Dispose())不起作用的原因是,您創建它時立即拋棄計時器!你必須讓它在後臺運行。

1

處置您的計時器上窗體的OnClosing情況下,如果這不是一個主要形式,或通過的方式,形式始終可見。

僞代碼可以是這樣的:

public partial class AirportParking : Form 
{ 
    ..... 
    ..... 

    protected override void OnClosing(...) 
    { 
     myTimer.Dispose(); 
    } 
} 

如果這是一些「長期運行」的形式,你應該在你沒有更多的需要的時候添加處置timere的,但我想你已經我知道。

0

儘管垃圾收集是一種很好的做法,但在這種情況下,它會在您關閉表單或實例死亡時自動完成。

我唯一真正擔心的是SQL讀取器,因爲您必須確保它們在完成時關閉,否則會導致各種問題。

+0

好的 - 謝謝:-(....我是關於很快添加一些SQL的東西! – whytheq 2012-04-18 10:07:09