我正在寻找一种避免使用事件时发生内存泄漏的解决方案(如果从未从事件源中删除侦听器,则可能会发生这种情况。我发现此code project article描述了一个WeakEvent
类,如下所示:
sealed class EventWrapper
{
SourceObject eventsource;
WeakReference wr;
public EventWrapper(SourceObject eventsource,ListenerObject obj) {
this.eventsource = eventsource;
this.wr = new WeakReference(obj);
eventsource.Event += OnEvent;
}
void OnEvent(object sender,EventArgs e)
{
ListenerObject obj = (ListenerObject)wr.Target;
if (obj != null)
obj.OnEvent(sender,e);
else
Deregister();
}
public void Deregister()
{
eventsource.Event -= OnEvent;
}
}
据我所知,侦听器对象包装在WeakReference
中,从垃圾回收器的角度来看,它不被视为对事件侦听器的引用。
我的问题:使用此模式时,尽管事件源事先未触发任何事件,但垃圾收集器是否有可能删除ListenerObject obj
?在那种情况下,由于触发事件没有转发到ListenerObject
,因为垃圾收集器将其删除(因为只有WeakReference
指向它),所以整个模式变得不确定。如果这是正确的,为什么我仍然应该使用这样的模式?
Thx