对象终结或垃圾收集的事件

时间:2012-03-20 14:30:00

标签: c# .net garbage-collection

对于远程处理框架,我需要保留一些关于我正在返回的对象的元数据。 我无法控制对象本身(所以我不能让它们成为IDisposable),我也不知道它们的类型。我唯一的假设是它是一种参考类型。

问题是生命时间,我什么时候可以释放元数据。

我打算创建一个静态字典(ConcurrentDictionary)并在那里保存一个WeakReference给对象和元数据。问题是,我怎么知道何时删除元数据? 有没有办法在对象本身最终确定时收到通知?

我也不关心死灵法术(物体复活)

谢谢

3 个答案:

答案 0 :(得分:3)

如果您使用的是.NET4或更高版本,则可以使用ConditionalWeakTable<K,V>

这意味着你(可能)不需要担心自己释放元数据:一旦对象本身消失,它就会从表中消失。

  

ConditionalWeakTable<TKey, TValue>类与其他类不同   集合对象在其管理对象的生命周期中   存储在集合中。通常,当一个对象存储在一个   收集,它的寿命持续到它被删除(并且没有   对对象的附加引用)或直到集合对象   本身就被摧毁了但是,在ConditionalWeakTable<TKey, TValue>类中,向表中添加键/值对无法确保   密钥将持续存在,即使它可以直接从a到达   存储在表中的值(例如,如果表包含一个键,   A,值为V1,第二个键B,其值为P2   提及A)。相反,ConditionalWeakTable<TKey, TValue>   没有其他人就会自动删除键/值条目   表格之外存在对密钥的引用。

答案 1 :(得分:1)

收集特定对象时,您不会收到信号。

您最好的选择是将肉类数据与弱引用相结合,并定期扫描集合。

答案 2 :(得分:0)

虽然通常不建议,但您也可以编写自己的终结器,以便在最终确定对象时使用。 ConditionalWeakTable建议听起来像是面向你想要完成的事情。