Bu modelin beklediğiniz gibi yaptıklarını sanmıyorum. Bellek sızıntılarını önlemek için etkin nesneyi bir referans tutmasını engellemeye mi çalışıyorsunuz? Lambda ifadesi, ProcessEvent
değerini değerlendirmek için this
değerini yakalar (ProcessEvent
bir örnek yöntemdir), böylece sızıntıya sahip olursunuz. Bu kod, SomeEvent += (sender, e) => ProcessEvent();
ile aynıdır.
Sen (ayrıca ne istediğinizi değil) daha böyle bir şey yapmak için çalışıyor olabilir: Eğer güçlü bir başvuru olmaz bu yüzden,
var reference = new WeakReference((Action)ProcessEvent);
SomeEvent += (sender, e) => ((Action)reference.Target)();
Şimdi lambda ifadesi WeakReference yakalayacaktır this
. Ne yazık ki, hiçbir şey ProcessEvent tarafından oluşturulan temsilci referans değil, bu yüzden this
hala hayatta olsa bile bir sonraki GC üzerinde kaldırılacaktır. (Bu ayrıca Hedefin boş olup olmadığını da kontrol etmez).
Böyle bir şey deneyebilirsiniz: bu gibi kullanmak sonra
public EventHandler MakeWeakHandler(Action action, Action<EventHandler> remove)
{
var reference = new WeakReference(action.Target);
var method = action.Method;
EventHandler handler = null;
handler = delegate(object sender, EventArgs e)
{
var target = reference.Target;
if (target != null)
{
method.Invoke(target, null);
}
else
{
remove(handler);
}
};
return handler;
}
ve: ProcessEvent alıcıya zayıf başvuru tutacak ve otomatik olarak olayı kaldıracak
SomeEvent += MakeWeakHandler(ProcessEvent, h => SomeEvent -= h);
Olaydan toplayıcı, olay düzenli olarak yükseltildiği sürece bellek sızıntılarını önlemesi gereken toplandı.
Sorunuzu/yanıtı gördünüz mü [burada] (http://stackoverflow.com/questions/1747235/weak-event-handler-model-for-use-with-lambdas)? Tek liner değil, ama * düşünüyorum * işe yarıyor ... – Benjol