关于我之前的问题,我需要检查一下将由Castle Windsor实例化的组件,在我的代码使用完之后是否可以进行垃圾回收.我在前一个问题的答案中尝试了这个建议,但它似乎没有按预期工作,至少对我的代码而言.所以我想编写一个单元测试来测试在我的一些代码运行之后是否可以对特定对象实例进行垃圾回收.
这有可能以可靠的方式进行吗?
编辑
我目前根据Paul Stovell的答案进行了以下测试,该答案成功:
[TestMethod]
public void ReleaseTest()
{
WindsorContainer container = new WindsorContainer();
container.Kernel.ReleasePolicy = new NoTrackingReleasePolicy();
container.AddComponentWithLifestyle<ReleaseTester>(LifestyleType.Transient);
Assert.AreEqual(0, ReleaseTester.refCount);
var weakRef = new WeakReference(container.Resolve<ReleaseTester>());
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--;
}
}
Run Code Online (Sandbox Code Playgroud)
我是否正确地假设,基于上述测试,我可以得出结论,使用NoTrackingReleasePolicy时Windsor不会泄漏内存?
最近我注意到我的应用程序似乎正在吃掉永不释放的内存.在使用CLRProfiler进行分析后,我发现我使用的Castle Windsor容器正在抓住物体.这些对象在config xml中使用lifestyle ="transient"属性声明.
我发现如果我明确调用IWindsorContainer.Release(hangingObject)它会丢弃它的引用.
这引起了一个问题,我并没有想到,对于一个短暂的生活方式对象,CastleWindsor会保留一个引用并有效地创建泄漏.这将是一个相当普通且容易出错的任务,在所有适当的位置插入显式的Release调用.
你有没有看到这个问题,你有什么建议可以解决这个问题吗?