2010-02-03 49 views
3

我有一個Windows.Forms應用程序,其中一個ListBox中填充了Account對象。 當用戶從列表中選擇一個帳戶時,我附加了一個EventHandler,負責更新所選帳戶事務,當用戶正在查找時有新的帳戶事務。垃圾收集器的事件處理程序

private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    var selected = listBox1.SelectedItem as Account; 
    if (selected != null) 
    { 
     UpdateTransactions(selected); 
     selected.OnNewTransaction += (s, a) => UpdateTransactions(selected); 
    } 
} 

然後我的問題如下;當用戶從列表中選擇另一個帳戶並且所選帳戶超出範圍時,該事件處理程序是否會自動處理? 還是繼續徘徊,然後如果用戶再次選擇相同的帳戶被分配另一個處理程序,從而創建一個內存泄漏?

回答

3

它仍然,所以每次用戶再次選擇同一帳戶它再次分配。

爲了拆卸事件再次,你應該調整你附上該事件的方式,保持對它的引用:

EventHandlerType handler = (s, a) => UpdateTransactions(selected); 
selected.OnNewTransaction += handler; 

// When you want to remove the handler do this (make sure you "store" handler somewhere) 
selected.OnNewTransaction -= handler; 
+0

感謝您的快速回答:) – Frank 2010-02-03 13:44:36

0

你需要將其卸下手動

1

事件處理程序僅用於垃圾收集的候選人當Account對象自己收集垃圾。所以是的,除非您不明確地將它們從Account對象中分離出來,否則這些句柄將繼續存在,並且是的,該事件將包含您附加到它的所有句柄。