如何在.NET 4.x中强制完全垃圾回收?

时间:2013-05-27 10:34:21

标签: c# .net weak-references

我在.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中收集该引用?

提前致谢。

2 个答案:

答案 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来运行我的测试,它正在检测输出组件,产生这种行为(禁用输出仪器使测试在所有平台上通过)。