2008-12-05 31 views
5

Asp.net'de geçerli olmak için abone olmanın/aboneliğin iptal edilmesine ilişkin aynı en iyi uygulama kuralları nelerdir?Asp.net'deki (elle abone olunan) etkinlikten çıkmak zorunda mıyım?

Bunun aptalca bir soru gibi göründüğünü biliyorum, ancak bunun hakkında düşündüğümde, insanların bir sayfada bir etkinliğe ilk kez abone oldukları ve daha sonra web isteğinde daha sonra aboneliği iptal ettikleri hiçbir kodu gerçekten görmedim.

Örnek 1: Bir sayfada, Page_Load yönteminde, bir ListView'deki bir güncelleştirme etkinliğine abone oluyorum. O olaydan sonra, örneğin OnPreRenderComplete yönteminde aboneliği iptal etmeli miyim?

Örnek 2: Pasif görünümde bir görünüm (Sayfa denetimi/Kullanıcı denetimi), herhangi bir şey yapması için sunucuya ihtiyaç duyduğunda bir olay ortaya çıkarır. Bu nedenle sunum yapan kişi, manzaradaki olaylara abone olmak zorundadır, ancak aynı zamanda olaylardan bir kez daha çıkmak zorunda mıdır?

Saygılarımızla, Egil.

cevap

4

Sayfa örneği ve bileşenlerinin tümü, istek tamamlandığında "kapsam dışına çıkacaktır", örn. GC için uygun hale gelirler. Böylece ListView'ınız, sayfadaki/kullanıcı denetimleriyle birlikte kapsam dışına çıkar. Abonelikten çıkmanıza gerek yoktur (örneğin, her istekte bulunan bir tür bekarlığa ait bir etkinliğe abone olmadıkça ve sayfanın yöntemlerinden birini etkinlik işleyicisi olarak kullanmıyorsanız).

Aynı şey sunucu için de geçerlidir (bu sunucu yalnızca tek bir sayfa ile kullanıldığı ve bundan sonra kapsam dışında kaldığı sürece).

+0

Tamam, sadece doğru bir şekilde anladığımdan emin olmak için: asp.net önbelleğinde bir tekil nesnem varsa, bir sunum yapan kişi bu olayın üzerine abone olmamalıdır, çünkü sayfa bittiğinde singleton atılmayacaktır ve sunum yapan kişi buralarda takılacak mı? –

+0

Evet, yanıtlarımdaki ifadeyi güncelledim. Temel olarak uzun ömürlü nesnelerinizle ilgili sayfaya (veya içindeki herhangi bir kontrole) herhangi bir referans bırakmamalısınız. Bir olay işleyici böyle bir referans olabilir. – liggett78

+0

Sadece bir örnek: eğer uzun ömürlü bir nesneye abone olursanız ve sayfanızın yöntemlerinden birini bir işleyici olarak kullanırsanız, uzun ömürlü nesneniz sayfaya bir başvuruda bulunur. GC için sayfa hala görünür/kapsamlıdır. Etkinlik işleyicisi olarak statik bir yöntem olsa Tamam olur. – liggett78

2

Genellikle, hayır. Sayfa kaldırıldığında olayların otomatik olarak boşaltılması gerekiyor. Olması gerek. Daha önce bir hata yaptım (.NET 1.1'de).

Sayfada bir sorun fark etmedikçe (arama yığında bir hayaletten 20 kez çağrılan bir yöntem gibi: abonelikten çıkarılmayan bir şeyin belirtisi genellikle) aboneliği iptal etmeyeceğim.

İlgili konular