2010-07-30 105 views
3

我有一个类如下所示。服务器实例保存对侦听器实例的引用。监听器通过事件代理保存对服务器实例的引用。这是否会阻止GC收集服务器实例?如果是这样,如何打破这个循环?我应该实施IDisposable还是重写Finalize方法还是做其他事情?这是内存泄漏吗?

public class Server 
    {   
     public Listener Listener { get; private set; }   

     public Server(Listener listener) 
     { 
      Listener = listener; 
      Listener.ClientChannelConnected += new EventHandler<ClientChannelConnectedArgs>(listener_ClientChannelConnected); 
     }   

     void listener_ClientChannelConnected(object sender, ClientChannelConnectedArgs e) 
     { 
      ... 
     } 
} 

回答

1

不。.NET垃圾收集器足够智能,可以解析循环引用。

+0

我不”知道:( 谢谢! – Marko 2010-07-30 06:08:01

1

奇怪的是,我发现这种类型的代码始终在.net中泄漏,并且必须小心 - =事件处理程序。确实,内存是最终发布的,但实际上你希望早一点清理完毕。

另外,永远不会有使用lambda表达式来处理事件,因为您将永远不会有对该对象的引用。

+0

如果别的东西还是得拿着委托列表中对象的引用,这会发生。在这种情况下,如果听者仍然在其他地方使用您正在使用的实例来完成,即使后这可能就是为什么你看到它们被保存在内存中的时间更长了 – 2012-10-23 17:18:43

+0

当你订阅事件的对象将在你想要处置事件的同一时间处理时,也可以使用Lambda的。当一个事件的制作者被处置时,它会失去对事件处理程序的引用,因此这些对象可能会被垃圾收集。 – 2012-10-23 17:21:39