0

良い一日!

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)、参照をクリアしたので、それへの唯一の参照はアクセサーからのものです-なぜそれを収集できないのですか?コピーではなく、実際のオブジェクトを保持します。

4

1 に答える 1

1

クラスのcheckProcess_Accessorフィールドをnullにしないので、クラスにリンクされているすべてのものがまだ有効であり、収集できません。

PrivateObjectは明らかに、渡されているcheckProcessへの参照を保持しているため、checkProcess_AccessorはPrivateObjectへの参照を保持している必要があります。アクセサーとPrivateObjectを介してcheckProcessにアクセスできるため(すべての参照がプライベートの場合は、リフレクションを使用する必要がある場合があります)、オブジェクトを収集できません。

ちなみに、ガベージコレクションを強制するのは本当に悪い考えですが、それを行う正当な理由があると確信しています。

于 2012-10-17T13:20:15.150 に答える