2010-11-22 17 views
7

Bir uygulama süresi boyunca var olan bir nesnem var mı? Buna GlobalWorker diyelim. GlobalWorker'ın etkinlikleri vardır, ör. Başka nesnelerin abone olabileceği UserLoggedIn. Şimdi bir Silverlight sayfası veya oluşturulduğunda UserLoggedIn olayına abone olan bir asp.net sayfası veya bir şey olduğunu düşünün.Olay işleyicileri ve uygulama ömür boyu nesneleri C# - ben çıkarmamalı mıyım?

public SomePage() 
{ 
GlobalWorker.Instance.UserLoggedIn += new EventHandler(OnUserLoggedIn); 
} 

private void OnLoggedIn(object sender, EventArgs e) 
{ 

} 

Bu olayın varlığı sayfanın çöp toplanmasını engelliyor mu? Öyleyse, bu örnekte kullanılacak en iyi şablon nedir: zayıf etkinlik işleyicileri, aboneliği Yükleme olayına taşıma ve UnLoad olayında abonelikten çıkma?

cevap

3

Weak Events'u kullanın.

Bu WPF'de sık karşılaşılan bir sorundur ve bu konuda düşündüğünüze göre iyi.

+0

Windows Forms'ta da yaygın bir sorun. –

+0

Heck, bu bir problem bile JavaScript! – Gabe

+0

'Zayıf olay' deseni, daha genel olduğundan (ve daha az [yedek] kod gerektirdiğinden) dinleyici sınıfındaki (ler) olay işleyicisinin kaydını tutmak için tercih edilir mi? –

1

Evet, davranış sayfanın GC olmasını engelliyor.

Bunun nedeni, UserLoggedIn'ın süresiz olarak SomePage'e bir başvuru tutacağıdır. İşleyicinin açık bir şekilde kaldırılması yoktur ve weak events kullanılmadığından dolaylı olarak da kaldırılmayacaktır.

Zayıf olayları belirtilen başka bir poster olarak kullanabilirsiniz, ayrıca tasarımınızı bir dereceye kadar düşünebilir ve etkinlik davranışını işlevselleştirip kapatamayacağınızı görebilirsiniz. Belki de, bu olayda (kullanıcı kimlik bilgileri) küresel olması gereken her şey, olayın nerede tutulabileceği gibi.

Bu, bakımını yaptığınız bir kerelik bir etkinlik olsaydı, işleyicide de kaydırabilirsiniz. Özel gereksiniminize ve örneğinize gerçekten geri döner, zayıf olay deseni bu uygulama ile başa çıkmak için gereken modeldir, ancak bu deseni her bir sorun yüzeyinde kullanmanız gerektiği anlamına gelmez.

+0

WeakEvent'e pek çok yerde başvurmak isteyen bir eğilim var değil mi? Belki de tembelliğe doğru bir eğilimdir - yani, uygulamanızın elden çıkarılma yönlerini düşünmemek. Çoğu yerde, yeniden düşünmenin bir kısmı WeakEvent'e olan ihtiyacı ortadan kaldırabilir. –

İlgili konular