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

Gui*_*e86 10 .net c# 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:

.NET 2.0  PASS
.NET 3.0  FAIL
.NET 3.5  PASS
.NET 4.0  FAIL
.NET 4.5  FAIL
Run Code Online (Sandbox Code Playgroud)

这是在某处记录的吗?

有没有办法强制GC在.NET 4.5中收集该引用?

提前致谢.

Cod*_*ray 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);
    }
}
Run Code Online (Sandbox Code Playgroud)