2012-08-30 56 views
3

我瞭解弱參考和弱事件模式。爲什麼在控件上使用弱事件模式而不是在其他地方管理生命週期?

使用弱事件模式的一個地方是在Controls和DataModel之間的DataBinding中。 在DataBinding的過程中,如果DataModel支持INotifyPropertyChange,則控件將要求DataModel通過事件向他建議更改。如果沒有弱事件,DataModel會保留對控件的強烈參考。由於該參考,該窗口可用於GC的同時,該控件不能被標記爲可用於GC。

微軟決定使用弱引用來解決這個問題。

我想知道是否其他替代方案像擬議的那樣不會更好?

替代方案:在窗口上實現IDisposable,並使用代碼傳遞子元素UiElements以要求他們將DataBinding移除到DataModel? 該解決方案會出現什麼問題?

+0

什麼保證你的窗口將在任何合理的時間內關閉,或者由於強大的參考,你將有少量的控件在卸載後保持活動狀態?沒有,這就是爲什麼我們有弱事件模式。 – Will

+0

你怎麼知道微軟實現了一個弱事件模式來完成這個任務(即使用某種WeakEventManager)? –

+1

嗨,彼得,我在「WPF控制開發」(優秀的書) –

回答

5

使用弱事件有一個基本的優勢:解除DataModel中Control的任務留給垃圾收集器本身。垃圾收集器通常運行在低優先級的線程中,該線程僅在系統空閒或需要釋放內存時激活,因此不會減慢其他活動的速度。相比之下,讓IDisposable從DataModel分離控件意味着如果您手動處理控件,解除綁定必須發生在常規調用者的線程中。

另一個方面(這是由MVC模式強制)是讓模型獨立於視圖。如果您將對象生命週期視爲依賴關係,那麼弱引用正是保持模型獨立的原因,因爲您不必依賴控件的合作來釋放綁定。

+0

紅色它這聽起來對我來說是邏輯。我等了一個星期,看看是否有更好的答案,如果沒有,我會接受你。謝謝。 –

+0

有趣的問題是爲什麼沒有弱點? –

+0

@voroninp:實例方法的委託必須始終引用一個對象,所以引用不能很弱。另一方面,靜態方法委託永遠不會引用一個對象,所以它也不弱。如果你喜歡,你可以打開關於這個話題的新問題。 –

相關問題