9

考虑以下方法:

DoTimeIntensiveOperation()
{
    var t = new Stopwatch();

    foreach(var element in a_very_long_array)
    {
        DoATimeConsumingTask(element);
    }

    Console.WriteLine("Took me " + t.Elapsed);
    return;
}

我需要t.Stop()在返回之前打电话吗?

据我所知,垃圾收集器将销毁任何没有返回主方法的引用链的东西。对 created 的唯一引用Stopwatcht, 所以当DoTimeIntensiveOperation,t将被释放并且Stopwatch应该有资格被销毁。但是它仍然“滴答作响”的事实是否会干扰 GC?

4

1 回答 1

9

不,我抛出了这个快速测试,似乎一旦运行 GC,秒表就会被破坏。(请随时更正代码)

 static void Main(string[] args)
 {
      DoTimeIntensiveOperation();

      GC.Collect();
      while (swRef.IsAlive)
      {
      }
      Console.WriteLine("Destroyed");
 }

 static WeakReference swRef = null;
 static void DoTimeIntensiveOperation()
 {
     Stopwatch sw = new Stopwatch();
     sw.Start();
     swRef = new WeakReference(sw);
     return;
 }

输出DestroyedGC.Collect调用的时间。当然,在实际程序中,您不太可能显式调用GC.Collect,但这是为了表明 Stopwatch 对象一旦超出方法范围就会被销毁,即使Stop没有被调用。

于 2013-04-21T18:00:45.453 回答