2012-05-09 61 views
15

我目前正在學習WPF,並且已經發現了弱事件的概念,但我真的很努力'明白'。我已閱讀#1無數的文章,看了看代碼樣本,但它只是沒有在沉沒弱勢事件如何運作?

這裏是我的困境:

  1. 我明白,當一個對象訂閱的事件,的源事件必須持有對用戶的參考。
  2. 我也明白,如果訂閱者超出範圍或被明確銷燬但事件源未被銷燬,則訂閱者不會被垃圾收集,因爲事件源仍保留對訂閱者的引用。
  3. 避免這種情況的常用方法是在對象被銷燬之前從訂閱源中顯式取消訂閱訂閱者。我明白,如果程序員無法確定何時會發生這種情況,這可能是一個問題。

因此,從上面我理解如何使用事件可能導致內存泄漏,爲什麼需要一個弱引用模式,但是什麼阻止我從理解是弱事件模式如何實際實現此目標?它有什麼不同?

當然,即使有一個管理事件的類,它仍然必須訂閱和取消訂閱處理程序到/從源文件,因此引用必須存在,給使用事件的標準方式帶來同樣的問題。

有人請向我解釋我失蹤或誤解的基本概念,並幫助我「獲得」弱事件模式。

回答

16

你缺少的是,弱事件(使用Weak References下的封面,而後者使用GCHandle)利用內置的CLR行爲來處理需要訪問對象的特定情況,而沒有強有力的引用也就是說,它們不受您的應用程序代碼所遵循的正常「規則」的約束。

http://sankarsan.wordpress.com/2008/08/09/weak-references/

的幕後,WeakEventManager的持有弱引用到事件訂戶。如果用戶在事件發生之前碰巧是GC'd,WeakEventManager只是聳聳肩說,「好吧,那傢伙已經死了,我現在就停止試圖通知他這個事件」

+0

@ ChrisSinclair鏈接已關閉:( – SuperJMN

+1

@SuperJMN:謝謝。以下是更新後的鏈接:https://bkiener.wordpress.com/2010/02/11/simple-weak-event-listener-for-silverlight/ –