2011-02-26 122 views
5

這是一個使用Lambda作爲EventHandler的有效方法嗎?在我看來,處理程序已被正確刪除,並且垃圾收集器應該清理它。但是,我還沒有看到其他人這樣做,所以我想我最好仔細檢查一下。這會收集垃圾嗎?

沿着相同的路線,什麼是最好的工具(最好是免費的)來測試這是否實際上是垃圾收集?

DispatcherTimer timer = new DispatcherTimer(); 
timer.Interval = TimeSpan.FromSeconds(10); 

EventHandler callback = null; 
callback = (s, e) => 
    { 
     timer.Stop(); 
     timer.Tick -= callback; 
    }; 

timer.Tick += callback; 
timer.Start(); 
+0

對於任何有興趣的人,我確實創建了一個運行上述代碼1M的測試。內存使用始終保持在整個。 – herbrandson 2011-02-28 18:00:25

回答

3

是,回調已執行一次後回調將有資格進行垃圾回收。這是訂閱事件的合理方式,以便只執行一次處理程序。

這很難證明的代表將被垃圾收集 - 或實際上使用的對象來保存捕獲變量callbacktimer會被垃圾收集,無可否認...你真的想要把一個終結那裏(當然會影響垃圾收集本身),但不能像生成代碼那樣。

4

DispatcherTimer由Dispatcher類保持活動狀態,它在內部保留一個List<DispatcherTimer>,它存儲對啓用的任何定時器的引用。只要您停止()計時器,該對象就會從該列表中移除,如果您不存儲任何附加引用,就有資格進行垃圾回收。在這種情況下,你不需要定時器引用是一個局部變量。

不能在實現lambda的自動生成的類上獲得終結器。接下來最好的事情是簡單地運行這個代碼10億次。如果你沒有失控的會員消費和OOM,那麼它顯然不會泄漏。你會希望縮短間隔時間,所以直到聖誕節纔會開始,15毫秒是很好的。使用計時器來調用該方法,以免同時獲得太多活動計時器並允許調度員完成工作。