.NET:有什么方法可以告诉对象何时处理/垃圾回收?

时间:2010-03-30 17:01:49

标签: .net garbage-collection

给定一个对象,是否有任何方法可以获知该对象何时被垃圾回收?

我正在玩C#扩展方法的行为更像mixins(特别是在添加日志记录时)。所以基本上每个对象都获得一个新的Logger()方法,该方法返回一个ILog,它根据作为扩展方法目标的对象创建和缓存。

工作非常迅速,唯一的问题显然是在一个物体消失之后它的记录器可能会停留很长一段时间。我当然可以设置一些周期性机制来扫描记录器缓存并清除它但我宁愿设置一些垃圾收集通知,这样我就可以了解系统何时不再使用我的对象。

任何人都知道这样做的方法吗?

3 个答案:

答案 0 :(得分:11)

我认为这里通常做的是你保留一份WeakReferences的清单。使用弱引用,您可以通过检查IsAlive属性来判断您所引用的对象是否已被垃圾收集。

答案 1 :(得分:3)

在.net 4.0中,有一种类型ConditionalWeakTable,当任意对象有资格完成时,可以使用,虽然有点笨拙,但是请求通知。如果ConditionalWeakTable包含将一个对象(比如创建的第451个对象)映射到另一个对象(比如创建的第730个对象)的条目,那么只要条目保留在表中,并且根表引用都存在于表中并且对于对象#451,该表将被视为对象#730的有根引用。如果对象#451不存在有根引用,则该表将不再是对象#730的有根引用。

因此,如果对象#730保持对表的引用并且对象#730存在于表外,则对象#730将有资格与对象#451同时完成。如果对象#730覆盖Finalize(),则该覆盖可用作对象#451已有资格进行最终确定的通知。

请注意,对象#730的终结器只会触发一次,即使对象#451自我复活并重新注册以进行最终化。有可能编写代码,当对象#451真正变成死亡和埋葬时,即使它首先复活几次,也会触发通知,但是没有特别干净的方法。

答案 2 :(得分:1)

在GC期间调用

The destructor