垃圾收集 - 是否需要?

垃圾收集 - 是否需要?

问题描述:

通常,垃圾收集是一种很好的做法,因为它可以释放资源。 如何在下面的代码的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

您想要处理定时器资源的唯一地方是在回调函数myTimer_Elapsed中。你在哪里做myTime.Stop();你也可以做myTimer.Dispose();

但是,当应用程序的这部分超出范围时,无论如何将清理所有这些变量。只要定时器最终停止,一旦它被解除引用,它就会被GC收集。

using块(和您当前的Dispose())不起作用的原因是,您创建它时立即抛弃计时器!你必须让它在后台运行。

处置您的计时器上窗体的OnClosing情况下,如果这不是一个主要形式,或通过的方式,形式始终可见。

伪代码可以是这样的:

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

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

如果这是一些“长期运行”的形式,你应该在你没有更多的需要的时候添加处置timere的,但我想你已经我知道。

尽管垃圾收集是一种很好的做法,但在这种情况下,它会在您关闭表单或实例死亡时自动完成。

我唯一真正担心的是SQL读取器,因为您必须确保它们在完成时关闭,否则会导致各种问题。

+0

好的 - 谢谢:-(....我是关于很快添加一些SQL的东西! – whytheq 2012-04-18 10:07:09