Какие рекомендации по очистке ссылок на обработчики событий?
Часто я пишу такой код:
if (Session != null)
{
Session.KillAllProcesses();
Session.AllUnitsReady -= Session_AllUnitsReady;
Session.AllUnitsResultsPublished -= Session_AllUnitsResultsPublished;
Session.UnitFailed -= Session_UnitFailed;
Session.SomeUnitsFailed -= Session_SomeUnitsFailed;
Session.UnitCheckedIn -= Session_UnitCheckedIn;
UnattachListeners();
}
Цель состоит в том, чтобы очистить все подписки на события, которые мы зарегистрировали для цели (сеанса), чтобы сеанс мог свободно утилизироваться GC. У меня была дискуссия с коллегой о классах, которые реализуют IDisposable, однако, и он был убежден, что эти классы должны преобразовать очистку следующим образом:
/// <summary>
/// Disposes the object
/// </summary>
public void Dispose()
{
SubmitRequested = null; //frees all references to the SubmitRequested Event
}
Есть ли причина для предпочтения одного другому? Есть ли лучший способ сделать это вообще? (Кроме слабых эталонных событий везде)
То, что я действительно хотел бы видеть, это нечто похожее на шаблон безопасного вызова для вызова событий: то есть безопасный и повторяемый. Что-то, что я могу помнить, чтобы делать каждый раз, когда я присоединяюсь к событию, чтобы я мог убедиться, что мне будет легко убирать.