2008-10-09 72 views
28

它是实现事件的WeakReference经过处理,如果该事件是唯一持有的参考和作为垃圾进行回收,我们需要的对象一个好的做法呢?的WeakReference和事件处理

作为参数传递给这个:

乡亲们说,如果你订阅的东西是你的责任,退订,你应该这样做。

+0

问题就变成了:垃圾收集时该事件被触发的可能性有多大?为什么首先使用WeakReference? – 2008-10-09 04:27:15

+0

@Jon Limjap没有弱引用,是不是这个机会零,因为事件保持对象的轨道,因此它不会被收集? – fostandy 2011-04-21 04:55:19

回答

-2

当你认为解决了一个组的问题(事件管理参考和内存泄漏预防),它很可能会开辟一个新的问题。

的一个问题,我可以看到的是事件处理过程中,如果源对象是垃圾收集过程中(因为它是只能用弱引用举行),访问源对象将导致空引用异常的任何代码。你可以争辩说,事件处理程序不应该访问源对象,或者它必须有一个强大的参考,但可以认为这可能是一个比你想要解决的问题更糟糕的问题。

9

弱委托模式是什么,应该有在CLR。正常事件展示“在你活着时通知我”的语义,而我们经常需要“在我活着时通知我”。只是在WeakReference上委托是错误的,因为委托也是一个对象,即使recepient仍然活着并且有传入引用,委托本身只被WeakReference引用并立即收集。有关实施示例,请参阅this old post。在自己的权利

6

弱引用,作为委托持有引用不解决问题。在Prism(www.microsoft.com/compositewpf)附带的复合应用程序库中,有一个WeakDelegate类可以从源代码中获取。 WeakDelegate基本上是反射,并且只创建一个委托,然后释放它,因此不保留任何指针。在CAL内部,它由EventAggregator类使用,但是你可以自由使用,因为它在MS-PL下。

13

这是好事,从事件退订时,你可以的习惯得到的,但有时没有明显的“清理”方法,它可以做到的。我们最近在这个主题上发布了blog article;它包括使用WeakReference订阅事件很容易的方法。