C# 4.0 如果封闭方法即将返回,是否需要停止秒表?
考虑以下方法:C# 4.0 如果封闭方法即将返回,是否需要停止秒表?,c#-4.0,garbage-collection,stopwatch,C# 4.0,Garbage Collection,Stopwatch,考虑以下方法: DoTimeIntensiveOperation() { var t = new Stopwatch(); foreach(var element in a_very_long_array) { DoATimeConsumingTask(element); } Console.WriteLine("Took me " + t.Elapsed); return; } 返回前是否需要调用t.Stop() 据我所知,
DoTimeIntensiveOperation()
{
var t = new Stopwatch();
foreach(var element in a_very_long_array)
{
DoATimeConsumingTask(element);
}
Console.WriteLine("Took me " + t.Elapsed);
return;
}
返回前是否需要调用t.Stop()
据我所知,垃圾收集器将销毁任何没有返回到主方法的引用链的东西。创建的
秒表的唯一参考是t
,因此当DoTimeIntensiveOperation
时,t
将被释放,秒表应符合销毁条件。但是,它仍然“滴答”的事实是否会干扰GC?不,我抛出了这个快速测试,似乎一旦GC运行,秒表就会被破坏。(请随意更正代码)
调用GC.Collect
时,输出被销毁。当然,在实际的程序中,您不太可能显式调用GC.Collect
,但这是为了表明,即使未调用Stop
,Stopwatch对象也会在超出方法范围后被销毁
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;
}