Предотвращение утечек памяти с событиями - PullRequest
0 голосов
/ 13 февраля 2019
class Subscriber
{
    private Publisher _publisher;

    void SomeMethod()
    {
        _publisher = new Publisher();
        _publisher.SomeEvent += HandleEvent;
    }

    void HandleEvent(object sender, EventArgs e)
    {

    }
}

class Publisher
{
    public event EventHandler SomeEvent;

    void FireEvent()
    {
        SomeEvent?.Invoke(this, EventArgs.Empty);
    }
}

Нужно ли отсоединять HandleEvent от SomeEvent, чтобы избежать утечки памяти?Подписчик живет дольше, чем Publisher, поэтому, насколько я понимаю, после удаления Publisher он также удалит все обработчики событий из SomeEvent, поэтому не должно быть никаких ссылок.Я прав?

1 Ответ

0 голосов
/ 13 февраля 2019

Подписчик живет дольше, чем Publisher

Это означает, что с вами все в порядке, не нужно усложнять ситуацию с отказом от подписки.

Оператор _publisher.SomeEvent += HandleEvent; создает (несколько скрытую) ссылку от _publisher к его владельцу.Это предотвратит сбор подписчика-владельца, но только тогда, когда издатель его переживет.

Поскольку _publisher является частной, очистка неявная.Вы не должны (не должны) добавлять IDisposable здесь.То есть не для управления событиями.

И так как вы пометили эту WinForms: все эти обработчики событий (например, Button1_Click) все создают ссылки из элемента управления на форму-владельца, там также нет необходимости в очистке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...