[WinF,事件相关] EventHandlerList 调用 Dispose,会清理资源么
我将所有的事件全部添加到EventHandlerList,释放对象的时候调用EventHandlerList.Dispose(),能否保证对象可以被有效的释放 --------------------编程问答-------------------- 看你如何定义“保证对象可以被有效的释放”中的对象,和有效释放。如果‘对象’指的是Delegate,那么Delegate不是IDisposable,不会被Dispose。
如果‘对象’指的是事件的订阅者,那么,它们不会被处理(EventHandlerList没有拥有权)。
如果‘有效释放’指的是Dispose,那么根据上段,不会出现对Delegate或订阅者的Dispose。
如果‘有效释放’指的是不阻碍GC对订阅者的回收,那么答案是‘释放’了。不过,把EventHandlerList设置为null同样能达到‘释放’的目的。 --------------------编程问答-------------------- 代码说话好了
--------------------编程问答--------------------
public class Mod:IDispose
{
private EventHandlerList _evePool = new EventHandlerList();
private static readonly object _keyDoneEvent = new object();
public EventHandler DoneSomething
{
add{_evePool.AddHandler(_keyDoneEvent,value);}
remove{_evePool.RemoveHandler(_keyDoneEvent,value);}
}
public void Dispose()
{
//清理事件,以达到释放Mod对象的目的
_evePool.Dispose();
}
}
public class Program
{
static Main()
{
Mod mod = new Mod();
mod.DoneSomething += DoneFunc; //可能添加了多个,无法确认
//释放mod对象,正常来说,不能注销掉引用的事件 mod 无法被GC回收
//现在资源比较紧张,我想把 对象 mod回收掉
mod.Dispose();
}
}
--------------------编程问答-------------------- 是Mod引用别人,又不是别人引用Mod从而阻碍Mod被回收。
public class Program
{
static Main()
{
Mod mod = new Mod();
mod.DoneSomething += DoneFunc; //可能添加了多个,无法确认
//其实就是EventHandlerList.Dispose是否会,默认执行下,下面的语句,MSDN对这个讲的太少了
//mod.DoneSomething -= DoneFunc;
}
}
你要注销Mod,直接Dispose它就可以了。想要够格GC,就mod=null; --------------------编程问答-------------------- 现实情况比较复杂,会有外部引用调用事件的,我只是举个例子
补充:.NET技术 , C#