10

我在 .NET 4.x 中遇到了 WeakReferences 的问题,我正在运行测试以确保不再引用某些对象(使用 Wea​​kReferences),并且我注意到跨框架版本的行为不一致:

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

提前致谢。

4

2 回答 2

7

这里的问题与 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);
    }
}
于 2013-05-27T11:09:02.813 回答
0

感谢@Cody Gray(见评论),我想通了。

我使用 NCrunch 运行我的测试,它正在检测输出程序集,产生这种行为(禁用输出检测使测试在所有平台上通过)。

于 2013-05-27T11:08:51.120 回答