C# 如何在.NET4.x中强制执行完全垃圾收集?
我对.NET 4.x中的weakreference有一个问题, 我正在运行测试以确保某些对象不再被引用(使用WeakReferences),并且我注意到在不同的框架版本中,行为不一致: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
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上吗?