让我先进行一次演示:
[TestMethod]
public void Test()
{
var h = new WeakReference(new object());
GC.Collect();
Assert.IsNull(h.Target);
}
这段代码按预期工作。垃圾回收完成后,h
中的引用被置空。现在,这里有一个小细节:
[TestMethod]
public void Test()
{
var h = new WeakReference(new object());
GC.Collect();
try { } // I just add an empty
finally { } // try/finally block
Assert.IsNull(h.Target); // FAIL!
}
我在测试中添加了一个空的try/finally块,在
GC.Collect()
行之后,发现弱引用对象没有被收集!如果在GC.Collect()
行之前添加一个空的try/finally块,则测试通过。这是怎么回事?有人能解释一下try/finally块如何影响对象的生命周期吗?注意:所有测试都在Debug模式下进行。在Release模式下,两个测试都通过。
注意2:要重现此问题,必须将应用程序定位到.NET 4或.NET 4.5运行时,并以32位方式运行(目标x86,或使用“优先选择32位”选项的任何CPU)。
WaitForPendingFinalizers
没有效果。 - Stefan Dragnev