Анонимный метод как обработчик события - PullRequest
0 голосов
/ 26 апреля 2018

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

В некотором коде, который я написал некоторое время назад, я зарегистрировал событие (CheckExecution, принадлежащее isoDataTemp, см. Код ниже) с помощью анонимного метода. Но теперь мне пришло в голову, что присвоение анонимного метода событию является довольно злым, потому что нет способа отменить регистрацию метода в событии, верно? Однажды у меня была проблема с объектом, который нельзя было собрать мусором, потому что событие все еще указывало на него.

Так что мне интересно, могу ли я столкнуться с проблемой здесь. Моя спонтанная реакция - "нет, потому что анонимный метод принадлежит MainForm, и у него более длительное время жизни, чем у его isoDataTemp member" . Но я не уверен. Как насчет закрытия? Принадлежит ли анонимный метод к MainForm вообще? Я в замешательстве ...

public partial class MainForm : Form
{
    // ...

    void BackgroundWorkerISOAnalysisDoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = sender as BackgroundWorker;

        int prog = 0;

        isoDataTemp.CheckExecution += () => 
        {
            prog += 12;
            if (prog > 100) prog = 100;
            worker.ReportProgress(prog);
            return !worker.CancellationPending;
        };

        isoDataTemp.Analyze();

        if (worker.CancellationPending) e.Cancel = true;
    }
}

1 Ответ

0 голосов
/ 26 апреля 2018

Чтобы отменить регистрацию всех обработчиков событий для принадлежащего вам события, просто используйте этот код:

isoDataTemp.CheckExecution = null;

Обратите внимание, что это работает для анонимных и неанонимных обработчиков событий.

Из вашего примера вы можете добавить этот код в событие OnFormClosing, чтобы обеспечить правильное и полное удаление событий, назначенных вашему объекту isoDataTemp.

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

...