关于我之前的问题,我需要检查一下将由Castle Windsor实例化的组件,在我的代码使用完之后是否可以进行垃圾回收.我在前一个问题的答案中尝试了这个建议,但它似乎没有按预期工作,至少对我的代码而言.所以我想编写一个单元测试来测试在我的一些代码运行之后是否可以对特定对象实例进行垃圾回收.
这有可能以可靠的方式进行吗?
编辑
我目前根据Paul Stovell的答案进行了以下测试,该答案成功:
[TestMethod] public void ReleaseTest() { WindsorContainer container = new WindsorContainer(); container.Kernel.ReleasePolicy = new NoTrackingReleasePolicy(); container.AddComponentWithLifestyle(LifestyleType.Transient); Assert.AreEqual(0, ReleaseTester.refCount); var weakRef = new WeakReference(container.Resolve ()); Assert.AreEqual(1, ReleaseTester.refCount); GC.Collect(); GC.WaitForPendingFinalizers(); Assert.AreEqual(0, ReleaseTester.refCount, "Component not released"); } private class ReleaseTester { public static int refCount = 0; public ReleaseTester() { refCount++; } ~ReleaseTester() { refCount--; } }
我是否正确地假设,基于上述测试,我可以得出结论,使用NoTrackingReleasePolicy时Windsor不会泄漏内存?
这就是我通常做的事情:
[Test] public void MyTest() { WeakReference reference; new Action(() => { var service = new Service(); // Do things with service that might cause a memory leak... reference = new WeakReference(service, true); })(); // Service should have gone out of scope about now, // so the garbage collector can clean it up GC.Collect(); GC.WaitForPendingFinalizers(); Assert.IsNull(reference.Target); }
注意:很少有人会在生产应用程序中调用GC.Collect().但是测试泄漏是适当的一个例子.