Изменить: этот вопрос не о том, как отписаться от событий, потому что я знаю, как это сделать, если я хочу. Вопрос в том, есть ли конфликт со сборкой мусора в моем конкретном сценарии.
В некотором коде, который я написал некоторое время назад, я зарегистрировал событие (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;
}
}