2009-02-05 51 views
15

WindowsBase DLL定義IWeakEventListener事件與總結:什麼是WPF應用程序中使用的「弱事件」模式?

提供事件監聽是期望通過WeakEvent模式和System.Windows.WeakEventManager接收事件類的支持。

這個模糊的描述並沒有描述'WeakEvent模式'實際上是什麼。

那麼,這是什麼模式,爲什麼它被使用,並且它在WPF應用程序之外有用?

編輯已經有一些很好的答案,但沒有人談論過這種模式在WPF應用程序之外是否有用。在我看來,弱事件模式(如依賴屬性)與WPF API和DLL密不可分。是否有可用於非WPF應用程序的等效實現?

+0

我認爲弱引用是一種更一般化的方法,可以在WPF之外使用。看起來WeakEventManager是WPF事件處理的弱引用的特例。 – Philippe 2013-03-18 19:38:57

回答

23

最重要的一點是在備註:

用於跟隨 WeakEvent模式的主要原因是當事件 源具有對象生存期是 潛在獨立的事件的 偵聽器。使用WeakEventManager的 的中心事件 調度允許聽衆的處理程序,甚至收集 垃圾如果源 對象仍然存在

所以,如果你有publishersubscriber對象,再經過正常subscriber已訂閱publisher「 s事件,subscriber不能被垃圾收集。弱事件模式使得兩個「弱」之間的聯繫(如在WeakReference中),以便不存在這種依賴關係。 (另一種方法是從事件退訂時subscriber要成爲符合垃圾收集,而是變得混亂。)

+1

它究竟如何混亂? – zvolkov 2010-06-08 21:09:32

+6

@zvolkov:因爲用戶突然想知道什麼時候想要獲得垃圾回收的資格,這往往會導致額外的知識在整個系統中傳播,突然間你失去了*自動*垃圾收集。 – 2010-06-08 21:40:33

10

WeakEvent Patterns

訂閱事件可能會導致不被收集的用戶。你會認爲這個對象會被收集起來,因爲你沒有其他的引用 - 然而事件發佈者持有這個偵聽器對象並且保存在內存中(除非它明確地取消訂閱,在這種情況下你需要知道什麼時候退訂)。管理泄漏。

作爲一個拇指規則,如果事件發佈者將要比聽衆更長時間逗留,那麼您可能會遇到此問題並應該檢查此問題。

WeakEvents應該幫助你在這裏收集對象,如果唯一的活動引用是'弱'。只有當你打算開發新的控件時,你才應該關注這個模式,這些控件通常會暴露大量的事件。

其基本思想與WeakReference w.r.t類似。垃圾收集。

5

在.NET 4.5中,改進了對建立事件弱引用的支持。Read more

相關問題