[WinF,事件相关] EventHandlerList 调用 Dispose,会清理资源么

assky124 2013-11-25 03:38:13
我将所有的事件全部添加到EventHandlerList,释放对象的时候调用EventHandlerList.Dispose(),能否保证对象可以被有效的释放
...全文
113 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
assky124 2013-11-26
  • 打赏
  • 举报
回复
现实情况比较复杂,会有外部引用调用事件的,我只是举个例子
gomoku 2013-11-25
  • 打赏
  • 举报
回复
是Mod引用别人,又不是别人引用Mod从而阻碍Mod被回收。 你要注销Mod,直接Dispose它就可以了。想要够格GC,就mod=null;
assky124 2013-11-25
  • 打赏
  • 举报
回复

public class Program
{
   static Main()
   {
      Mod mod = new Mod();
      mod.DoneSomething += DoneFunc; //可能添加了多个,无法确认
       
      //其实就是EventHandlerList.Dispose是否会,默认执行下,下面的语句,MSDN对这个讲的太少了
      //mod.DoneSomething -= DoneFunc;
   }
}
assky124 2013-11-25
  • 打赏
  • 举报
回复
代码说话好了

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();
   }
}
gomoku 2013-11-25
  • 打赏
  • 举报
回复
看你如何定义“保证对象可以被有效的释放”中的对象,和有效释放。 如果‘对象’指的是Delegate,那么Delegate不是IDisposable,不会被Dispose。 如果‘对象’指的是事件的订阅者,那么,它们不会被处理(EventHandlerList没有拥有权)。 如果‘有效释放’指的是Dispose,那么根据上段,不会出现对Delegate或订阅者的Dispose。 如果‘有效释放’指的是不阻碍GC对订阅者的回收,那么答案是‘释放’了。不过,把EventHandlerList设置为null同样能达到‘释放’的目的。

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧