我在.NET 4.x中遇到WeakReferences问题, 我正在运行测试以确保不再引用某些对象(使用WeakReferences)并且我注意到框架版本之间的行为不一致:
using System;
using System.Text;
using NUnit.Framework;
[TestFixture]
public class WeakReferenceTests
{
[Test]
public void TestWeakReferenceIsDisposed()
{
WeakReference weakRef = new WeakReference(new StringBuilder("Hello"));
GC.Collect();
GC.WaitForPendingFinalizers();
GC.WaitForFullGCComplete();
GC.Collect();
var retrievedSb = weakRef.Target as StringBuilder;
Assert.That(retrievedSb, Is.Null);
}
}
结果:
.NET 2.0 PASS
.NET 3.0 FAIL
.NET 3.5 PASS
.NET 4.0 FAIL
.NET 4.5 FAIL
这是在某处记录的吗?
有没有办法强制GC在.NET 4.5中收集该引用?
提前致谢。
答案 0 :(得分:6)
这里的问题与NCrunch有关。如果我通过简单调用Debug.Assert
来替换测试,那么代码在我的机器上适用于所有版本的框架:
using System;
using System.Text;
using System.Diagnostics;
public class WeakReferenceTests
{
public void TestWeakReferenceIsDisposed()
{
WeakReference weakRef = new WeakReference(new StringBuilder("Hello"));
GC.Collect();
GC.WaitForPendingFinalizers();
GC.WaitForFullGCComplete();
GC.Collect();
var retrievedSb = weakRef.Target as StringBuilder;
Debug.Assert(retrievedSb == null);
}
}
答案 1 :(得分:0)
感谢@ Cody Gray(见评论),我想出来了。
我使用NCrunch来运行我的测试,它正在检测输出组件,产生这种行为(禁用输出仪器使测试在所有平台上通过)。