Nie trzeba zrezygnować w normalnym przypadku.
Impreza abonent nie może zapobiec wydawcy (testClass
) od gromadzone, ale przeciwnie może się zdarzyć. Nic nie widzę przy życiu, z wyjątkiem .
testClass.SomeEvent += this.OnSomeEvent;
testClass
jest utrzymanie this
żyje bo this
są przechowywane na liście wywołania testClass.SomeEvent
„s (tak, że OnSomeEvent
nazywa gdy istnieje SomeEvent
). this
nie będzie utrzymywał przy życiu testClass
subskrybując zdarzenia testClass
.
W poniższym kodzie obj
jest usuwany z kolekcji i jest śmieci zbierane bez wypisywania, można spróbować uruchomić kod, aby zobaczyć wynik:
void Main()
{
var obj = new BackgroundWorker();
obj.DoWork += OnSomeEvent;
var oc = new ObservableCollection<object>{ obj };
WeakReference objRef = new WeakReference(obj);
Console.WriteLine(objRef.IsAlive);
oc.Remove(obj);
obj = null;
GC.Collect();
Console.WriteLine(objRef.IsAlive);
}
private void OnSomeEvent(object sender, DoWorkEventArgs e)
{
Console.WriteLine("work");
}
wyjściowa:
prawda
Fałsz
Możesz rzucić okiem na similar question.
Thnx. A jaki jest najlepszy sposób? Robię to w collectionChanged. – Sasha