当前位置:编程学习 > C#/ASP.NET >>

[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();
   }
}
--------------------编程问答--------------------

public class Program
{
   static Main()
   {
      Mod mod = new Mod();
      mod.DoneSomething += DoneFunc; //可能添加了多个,无法确认
       
      //其实就是EventHandlerList.Dispose是否会,默认执行下,下面的语句,MSDN对这个讲的太少了
      //mod.DoneSomething -= DoneFunc;
   }
}
--------------------编程问答-------------------- 是Mod引用别人,又不是别人引用Mod从而阻碍Mod被回收。
你要注销Mod,直接Dispose它就可以了。想要够格GC,就mod=null; --------------------编程问答-------------------- 现实情况比较复杂,会有外部引用调用事件的,我只是举个例子
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,