2010-02-03 3 views
3

У меня есть приложение Windows.Forms со списком ListBox, заполненным объектами учетной записи. Когда пользователь выбирает учетную запись из списка, я присоединяю EventHandler, ответственного за обновление выбранных транзакций учетной записи, в случае появления новых пользователей во время просмотра пользователем.Garbagecollection обработчиков событий

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

0

Вам необходимо отсоединить его вручную

1

обработчиков событий являются единственными кандидатами для сбора мусора, когда Account объектов являются сами собираются для мусора. Так что да, ручки продолжают существовать, если вы не явно отделите их от Account объектов, и да, событие будет содержать все ручки, которые вы прикрепляете к нему.

Смежные вопросы