Aracılığıyla paylaş


Zayıf olay desenleri

Uygulamalarda olay kaynaklarını bağlı işleyicileri işleyicisi kaynağına bağlı dinleyici nesnesi ile birlikte edileceğinden değil, mümkündür. This situation can lead to memory leaks. Windows Presentation Foundation (WPF)belirli olaylar için özel Yöneticisi sınıf sağlayıp bu olay dinleyicileri, arabirim uygulama bu sorunu gidermek için kullanılan bir tasarım deseni tanıtır. Bu tasarım modeli olarak bilinen zayıf olay deseni.

Neden zayıf olay deseni uygulamak?

Listening for events can lead to memory leaks. The typical technique for listening to an event is to use the language-specific syntax that attaches a handler to an event on a source. Örneğin, C#, bu sözdizimi aşağıdaki gibidir: source.SomeEvent += new SomeEventHandler(MyEventHandler).

This technique creates a strong reference from the event source to the event listener. Normalde, bir olay işleyicisi için bir dinleyici ekleme (olay işleyicisi açıkça kaldırılır sürece), kaynak nesnenin yaşam süresi etkilediği nesnesinin yaşam süresi dinleyici neden olur. Ancak bazı durumlarda ait olup şu anda uygulamanın ve yaşam kaynağı tarafından görsel ağaç olduğu gibi diğer etkenler tarafından denetlenmek üzere dinleyici nesnesi yaşam isteyebilirsiniz. Whenever the source object lifetime extends beyond the object lifetime of the listener, the normal event pattern leads to a memory leak: the listener is kept alive longer than intended.

Zayıf olay deseni, bu bellek sızıntısı sorununu çözmek için tasarlanmıştır. Zayıf olay deseni kaydetmek için bir olay dinleyicisi gerekiyor, ancak dinleyici açıkça ne zaman kaydını bilmez gerektiğinde kullanılabilir. Kaynak Nesne yaşam dinleyicisinin yararlı nesne yaşam aştığında zayıf olay deseni de kullanılabilir. (Bu durumda yararlı tarafından belirlenir.) Zayıf olay deseni dinleyicisi için ve olay hiçbir şekilde dinleyici nesnesi yaşam özelliklerini etkilemeden sağlar. Yani örtülü kaynak başvurusundan dinleyici çöp toplama için uygun olup olmadığını belirlemez. Böylece zayıf olay deseni ve ilgili adlandırma zayıf başvuru, başvuru yapılır APIs. The listener can be garbage collected or otherwise destroyed, and the source can continue without retaining noncollectible handler references to a now destroyed object.

Kimin zayıf olay deseni uygulamak?

Zayıf olay deseni uygulamak, öncelikle denetim yazarlar için ilginçtir. Denetim Yazar olarak, büyük ölçüde sorumlu davranış ve içerik denetimi ve eklenmiş uygulamalar üzerinde sahip etkisi. Bu denetim nesnenin yaşam davranış özellikle açıklanan bellek sızıntısı sorunu işlenmesini içerir.

Belirli senaryolarda doğası gereği kendilerini zayıf olay deseni uygulamasına ödünç. Böyle bir senaryo veri bağlama ' dir. Veri bağlama, kaynak nesne bağlama hedeftir dinleyici nesnesi tamamen bağımsız olmasını yaygındır. Birçok yönünü WPF zaten veri bağlama sahip olayları nasıl uygulandığını uygulanan zayıf olay deseni.

Nasıl zayıf olay deseni uygulamak

Şu üç yönleri zayıf olay deseni uygulamadan oluşur:

  • Derive a manager from the WeakEventManager class.

  • Implement the IWeakEventListener interface on any class that wants to register listeners for the weak event without generating a strong reference to the source.

  • When registering listeners, do not use the conventional add and remove accessors of the event where you want the listener to use the pattern. Bunun yerine, AddListener ve RemoveListener uygulamalarında ayrılmış WeakEventManager için bu olay.

WeakEventManager

Zayıf olay deseni uygulamak için genellikle bir yönetici sınıf 1: 1 ilişki olayı ile oluşturursunuz. Adlı bir olay varsa, örneğin, Spin, siz oluşturacak bir SpinEventManager olay. adanmış zayıf Olay Yöneticisi olduğu sınıf Olay birden fazla sınıf var, genellikle her sınıf için de aynı şekilde davranır ve aynı olay veri türü paylaşır, aynı Yöneticisi her olay için kullanılabilir.

Ne zaman size türetmek dan WeakEventManager sınıfı, iki sanal yöntemleri geçersiz kılmak ve adları özellikle sanal bir şablon tarafından yönetilmeyen, ancak yine de bulunması birkaç diğer üyelere karşı karşıya. The overrides are used to initiate or terminate event delivery mode by the WPF infrastructure. Diğer üyelere işlevsellik sağlar böylece kendi IWeakEventListener uygulamaları kullanarak WeakEventManager iliştirme dinleyicileri için olay.

Dan türetmek hakkında daha fazla bilgi için WeakEventManagerbakın "Notlar için Inheritors" bulunan bölümünde WeakEventManager başvuru konusu.

IWeakEventListener

IWeakEventListener Arabirimi adlı bir tek arabirim yöntemi olan ReceiveWeakEvent. The ReceiveWeakEvent implementation must be a centralized implementation that directs any event reference that exists on that class to the appropriate WeakEventManager.

Uygulama hakkında daha fazla bilgi için IWeakEventListener arabirimi, "Notlar için uygulayıcıları" Bkz. bulunan bölümünde ReceiveWeakEvent yöntemi başvuru konusu.

Attaching Listeners

Sahip olduğunuzu varsayalım bir ClockwiseSpin olay (tarafından tanımlanan bir Spinner türü) Geleneksel bir olay yani. Eğer bir SpinListener işleyicisi iliştirmek += iþlecini kullanmak olacaktır için geleneksel tekniği (zayıf olay deseni kullanarak değil) bir dinleyici olmak istediği dinleyici sınıf:

spinnerInstance.ClockwiseSpin += new EventHandler(MyOnCWSpinHandler);

Uygulayan bir sınıf varsa IWeakEventListener için hesapları ve ClockwiseSpin olay ve kendi Yöneticisi uygulamasında, zayıf olay deseni kullanmak için sözdizimi aşağıdaki gibidir:

ClockwiseSpinEventManager.AddListener(spinnerInstance, this);

Bu olay sizin işleme mantığı taleplerinin biri içinde belirtilen ReceiveWeakEvent uygulamasına sınıfınızın olarak değil bir geleneksel temsilci tabanlı işleyicisi.

Implementing the Pattern for External Events

Bir ilginç zayıf olay deseni desen kodunuzu temel bir parçası olmayan bir olaya karşı uygulayabilirsiniz özelliğidir. From the perspective of the source, the way that handlers are attached to its event does not differ, and is controlled by the WeakEventManager. Yalnızca tanımlamanız gerekir bir WeakEventManager Bu olay ve sonra hesabı için o olayın bir parçası olarak ReceiveWeakEvent olası tüm dinleyici dinle zayıf olay deseni kullanmak istediği mantığınıo olay.

Ayrıca bkz.

Başvuru

WeakEventManager

IWeakEventListener

Kavramlar

Yönlendirilmiş Olaylara Genel Bakış

Veri Bağlama Genel Bakış