我有一个对象(Delegate),需要在另一个对象(TargetObject)处于活动状态时保持活动状态(不收集垃圾)。我希望在收集TargetObject时(或至少可用于收集)垃圾收集。
困难之处在于,我不想从TargetObject引用Delegate,因为我希望它可用于不知道Delegate的现有对象,而且我也不想影响TargetObject的寿命。这是可能吗?
谢谢。
编辑:感谢到目前为止的答复。我会尽力弄清楚我在做什么。
我正在尝试实现弱事件,但我不喜欢WeakEventManager(尤其是IWeakEventListener)。我想保留对指向对象TargetObject中方法的委托事件处理程序(Delegate)的弱引用。 TargetObject处于活动状态时,必须有一个对Delegate的强引用才能使Delegate保持活动状态,但是,如果寿命较长的对象引用Delegate,则它可以使TargetObject保持活动状态(不利于弱事件的目的)。
如果订阅弱事件的对象不必具有任何特殊的实现细节(例如必须保留代表的集合),那将是很好的。
编辑编辑:将“ A”更改为“代理”,将“ B”更改为“ TargetObject”
最佳答案
神圣的死灵,但是ConditionalWeakTable
可以满足您的需求。它允许将值与任意键相关联,并且键值对为ephemerons(正是您要找的东西,两年前了。不幸的是,当时没有.NET 4)。
即使没有ConditionalWeakTable
,也可能是Dictionary<WeakReference, Delegate>
,需要定期扫描以删除旧的无效值(即,当Dictionary大小加倍时,删除所有无效对)。使用此解决方案,如果Delegate引用TargetObject,虽然可以防止对的收集-设计了一个ConditionalWeakTable
问题来解决。
只是发布此信息,以防有人发现它有用。