Сборка мусора обработчиков событий - PullRequest
3 голосов
/ 03 февраля 2010

У меня есть приложение 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 ]

3 голосов
/ 03 февраля 2010

Остается, поэтому каждый раз, когда пользователь снова выбирает одну и ту же учетную запись, ей снова назначается.

Чтобы снова отсоединить событие, вы должны настроить способ прикрепления события, чтобы сохранить ссылку на него:

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;
1 голос
/ 03 февраля 2010

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

0 голосов
/ 03 февраля 2010

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

...