2013-04-21 17 views
8

Rozważmy następującą metodę:Czy muszę zatrzymać stoper, jeśli zbliża się metoda zamknięcia?

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

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

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

muszę zadzwonić t.Stop() przed powrotem?

O ile mi wiadomo, niszczyciel zniszczy wszystko, co nie ma łańcucha odniesienia, powracając do głównej metody. Jedynym odniesieniem do utworzonego jest t, więc gdy DoTimeIntensiveOperation, t zostanie zwolniony, a Stopwatch będzie mógł zostać zniszczony. Ale czy fakt, że wciąż "tyka" przeszkadza GC?

Odpowiedz

8

Nie, rzuciłem ten szybki test i wydaje się, że po uruchomieniu GC stoper zostaje zniszczony. (Zapraszam do skorygowania kodu)

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; 
} 

Wyjście jest Destroyed gdy GC.Collect nazywa. Oczywiście w prawdziwym programie raczej nie będzie się jawnie wywoływać GC.Collect, ale ma to na celu pokazanie, że obiekt Stopwatch jest niszczony po wykryciu zakresu tej metody, nawet jeśli nie został wywołany Stop.

Powiązane problemy