测试访问者垃圾收集

时间:2012-10-17 13:13:04

标签: c# .net garbage-collection coded-ui-tests

美好的一天!

我在VS2010中使用MSTest。为什么访问器在测试执行后不会被垃圾收集?这是我的代码。这很简单。

[TestClass]
public class CheckStringsWorkTest
{
  CheckProcess checkProcess = null;
  CheckProcess_Accessor checkProcess_Accessor;

  [TestMethod]
  public void StringShaveTest()
  {
        // MessageBox.Show("Start snapshot 1");

        checkProcess = new CheckProcess();

        checkProcess_Accessor = new CheckProcess_Accessor(new PrivateObject(checkProcess));

        checkProcess.Dispose();
        checkProcess = null;
  }

  [TestCleanup()]
  public void RunAfterAllTests()
  {
     // If uncomment then GC is OK
     //checkProcess_Accessor = null; 

     try
     {
         GC.Collect();
         GC.WaitForPendingFinalizers();
         GC.Collect();
     }
     catch { }

     // MessageBox.Show("Start snapshot 2");
 }

据我所知 - 访问者使用PrivateObject作为包装来保存实际对象。但是如果我处理并将对象设置为null(checkProcess),则清除引用,因此对它的唯一引用来自访问者 - 为什么它无法收集?它包含实际对象,而不是它的副本。

1 个答案:

答案 0 :(得分:1)

你没有将类中的checkProcess_Accessor字段归零,所以它所链接的所有内容仍然有效,无法收集。

PrivateObject显然是保持对正在传递的checkProcess的引用,而checkProcess_Accessor必须保持对PrivateObject的引用。您仍然可以通过访问器和PrivateObject访问checkProcess(尽管如果所有引用都是私有的,您可能需要使用反射来执行此操作),因此无法收集对象。

尝试强制垃圾收集是一个非常糟糕的主意,但我确信你有充分的理由这样做。