См. здесь :
Всякий раз, когда время жизни исходного объекта превышает срок жизни объекта
слушателя, нормальный шаблон событий приводит к утечке памяти:
слушатель остается живым дольше, чем предполагалось.
Как насчет альтернативного сценария, в соответствии с которым класс слушателя создает источник в локальном методе и прослушивает изменение свойства события источника, когда метод завершается, GC сможет восстановить память, используемую источник
public class Listener
{
private Data _data;
public Lisener(Data data)
{
_data=data;
}
public void DoWork()
{
var source = new SourceClass(_data); //this class inherits from INotifyPropertyChanged interface
var source.PropertyChanged+={//do something};
//when this method finishes, will the memory held by source be freed automatically by GC?
}
}