Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在.NET4.x中强制执行完全垃圾收集?_C#_.net_Weak References - Fatal编程技术网

C# 如何在.NET4.x中强制执行完全垃圾收集?

C# 如何在.NET4.x中强制执行完全垃圾收集?,c#,.net,weak-references,C#,.net,Weak References,我对.NET 4.x中的weakreference有一个问题, 我正在运行测试以确保某些对象不再被引用(使用WeakReferences),并且我注意到在不同的框架版本中,行为不一致: using System; using System.Text; using NUnit.Framework; [TestFixture] public class WeakReferenceTests { [Test] public void TestWeakReferenceIsDispos

我对.NET 4.x中的weakreference有一个问题, 我正在运行测试以确保某些对象不再被引用(使用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在.NET4.5中收集该引用

提前感谢。

感谢@Cody Gray(见评论),我明白了


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

这里的问题与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);
    }
}

请注意:GC不会在调试模式下收集不可访问的对象。谢谢,我会仔细研究的。嗯,您展示的代码适用于所有版本的框架。(嗯,我没有安装NUnit,所以我只是使用
Debug.Assert
,但这不会改变行为。)如果需要精确控制对象的处理,不确定.NET平台是否是最佳解决方案。。。每一个学习资源都非常清楚地说明-你无法预测GC何时发生,也不应该试图强制它…只是为了建立@walther提到的基础,即使你调用了垃圾收集器,也不能保证它会执行。谢谢,是NCrunch对程序集进行了测试,我禁用了该选项,它通过了。我正在尝试完成此操作,但我的应用程序是基于Silverlight 4构建的,并且我没有WaitForFullGCComplete选项。会在SL5上吗?