2010-07-30 104 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