肯定这个问题之前已经被问过,但我找不到任何关于这个问题的线索,所以一个已回答问题的链接也会有所帮助:
我有一个包含切片数组(切片)的体积类(VoxelVolume)。
public class VoxelVolume
{
Slice[] mySlices;
public VoxelVolume(int noOfSlices)
{
mySlices = new Slice[noOfSlices];
for (int i = 0; i < mySlices.Length; i++)
{
mySlices[i] = new Slice(this);
}
}
}
卷知道切片,切片知道卷:
public class Slice
{
public VoxelVolume Volume
{
get;
private set;
}
public Slice(VoxelVolume aVolume)
{
Volume = aVolume;
}
}
问题是卷永远不会被垃圾收集,因为存在相互对象引用。出于这个原因,我将切片到卷的引用实现为 WeakReference:
public class Slice
{
WeakReference myVolume;
VoxelVolume Volume
{
get
{
return (VoxelVolume)myVolume.Target;
}
}
public Slice(VoxelVolume aVolume)
{
myVolume = new WeakReference(aVolume);
}
}
现在垃圾收集工作了,但需要额外的 WeakReference。由于我可以拥有数千个切片,因此 WeakReferences 的工作量非常大。
编辑:首先它没有出现,但由于我们使用了大量内存,所以出现了“内存泄漏”。因此,我们使用 JetBrains dotTrace 查看了引用和可用的对象。在那里,我们看到有很多对象可用,尽管它们不再使用。正如我之前所说,使用 WeakReference 解决了这个问题。
问题是,TreeView 是如何解决这些问题的,因为 TreeNode 也有 TreeView 的知识。
你知道一个合适的解决方案吗?
谢谢马丁