我有一个对象(Delegate)需要保持活着(不是垃圾收集)而另一个对象(TargetObject)是活着的。我希望在收集TargetObject时(或至少可用于收集)对Delegate进行垃圾回收。
难点在于我不想从TargetObject引用Delegate,因为我希望它能够用于不知道Delegate的现有对象,并且我不想影响TargetObject的生命周期。这有可能吗?
感谢。
编辑:感谢目前为止的回复。我会试着澄清一下我的目标。
我正在尝试实现弱事件,但我不是WeakEventManager(特别是IWeakEventListener)的粉丝。我想对委托事件处理程序(Delegate)持有弱引用,该委托事件处理程序指向对象TargetObject中的方法。需要对Delegate有一个强引用,而TargetObject处于活动状态以保持Delegate活着,但是如果具有更长生命周期的东西引用Delegate,它会使TargetObject保持活动状态(挫败弱事件的目的)。
如果订阅弱事件的对象不必具有任何特殊的实现细节,例如必须保留委托集合,那将是很好的。
编辑编辑:将'A'更改为'委托',将'B'更改为'TargetObject'
答案 0 :(得分:3)
神圣的死灵,但ConditionalWeakTable
正是你所需要的。它允许将值与任意键相关联,键值对为ephemerons(正是您 正在寻找的东西,2年前现在......很遗憾.NET 4不可用)
即使没有ConditionalWeakTable
,解决方案也可能是Dictionary<WeakReference, Delegate>
,定期扫描以删除旧的死值(即每当字典大小翻倍时,删除所有死对)。使用此解决方案,如果委托引用TargetObject,它会阻止对的收集 - 问题ConditionalWeakTable
旨在解决。
只需张贴此内容,以防有人发现它有用。
答案 1 :(得分:2)
这听起来像是一个设计问题。如果B不需要知道A的实例,你为什么要关心A是否还活着?
你可以可能使用一个容器对象来做这个,该容器对象具有对B的弱引用和对A的强引用,并且定时器定期检查弱引用是否仍然存在...但它会是一个非常糟糕的黑客。
如果你能解释为什么你认为你需要这个,我们可能会建议一个更好的方法。
答案 2 :(得分:1)
为什么不从B中引用A? 这将使A保持活力,并且不需要A知道B ......
答案 3 :(得分:0)
我认为拥有一个没有任何引用的“活着”对象是不错的设计。
你总是可以创建一个静态列表,其中包含对应该保持活着的对象的引用,但当然你必须自己管理它。
我没有看到一个干净的解决方案,但也许StackOverflow上的一些超级人物会提出一个解决方案。
答案 4 :(得分:0)
在B的析构函数(finalize)方法中抛出一个事件,并为该事件编写一个杀死A的处理程序。