在.NET中集合中的WeakReferences的最佳时间

我有一个集合(我正在写一个弱字典 ),我需要定期剔除死的WeakReferences。 我经常看到的是检查添加和删除方法,即“在对集合进行X修改之后,是时候剔除了”。 这对我来说是可以接受的,但似乎应该有更好的方法。

我真的很想知道GC何时运行并立即运行我的清理代码。 毕竟,GC可能是确定何时是清理死引用的好时机的最佳机制。 我发现垃圾收集通知 ,但看起来这不是我想要的。 我不想生成一个单独的线程来监视GC。 理想情况下,我的集合将实现IWantToRunCodeDuringGC或订阅System.GC.Collected事件。 但.NET框架可能无法信任用户代码在GC期间运行…

或者也许还有另一种我忽视的方法。

编辑:如果我的代码在GC之后,之前或期间运行,我认为这并不重要。

我想你想创建一个弱字典作为一些“惰性”缓存某些数据的方式。

您需要考虑GC将经常发生的事实,如果没有其他对象引用它们,您的弱引用将在大多数时间内死亡。 GC大约在每256KB内存分配后发生。 经常这样。

将缓存实现为具有最大元素数量的字典可能会更好。 然后,您可以使用最近最少使用的算法或基于时间的算法将元素推出集合。 通常这种方法比使用弱引用具有更好的性能和内存消耗。

你不能只使用没有引用的对象,然后在终结器中调用一些代码吗? GC收集对象时调用终结器。

编辑:当然,你不知道什么时候GC完成..嗯。

从避免内存泄漏的角度来看,我建议在将某些内容添加到字典时,检查已执行的垃圾收集的数量。 如果在上次检查字典和最后一次收集的时间之间添加的项目数超过字典大小的合理分数(例如,10%,或某些最小项目数,以较小者为准) ),这将是字典应该被扫描的标志。 请注意,此方法会将字典中过多项目的数量限制为字典大小的某一部分,同时提供合理的性能,而不管字典大小如何。