WPF內存之泄露防范方法介紹
WPF工具固然好用。但是作為一個出現不久的新工具,當然會存在很多缺陷以及使用中的問題等。我們接下來將會了解到有關WPF內存中有關泄露的一些問題。#t#
Windows Presentation Foundation即WPF,它代表著Windows平臺UI的未來。微軟有其自身的打算,而稍晚于WPF的Silverlight將占領Web和移動設備市場。不過,和任何的新技術一樣,都會經歷一些問題,如某些相當嚴重的內存泄漏問題。
我們要討論諸多內存泄漏。第一個WPF內存問題已經發現一段時間,但它并沒有引起大多程序員的關注,甚至是專家們的注意。引發該問題需要以下條件配合:
引用對象X屬性P的數據綁定路徑
對象X含直接引用或間接引用數據綁定操作的目標對象
屬性P通過PropertyDescriptor對象而非DependencyProperty對象或PropertyInfo對象訪問
這個問題在KB 938416中有詳細的描述。
接下來是一個讓人極其厭煩的WPF內存Bug,它在我們使用一個數據綁定集合代替另外一個時觸發。Ayende Rahien有引發該問題的源代碼。Mike Brown解釋道:
經過深入研究以后,我發現該綁定系統并沒有解除對“Name”屬性的監聽程序,但相關數據已被修改。
這很明顯是一個Bug,它和綁定系統有關。當你注意到數據被修改過,而非解除已有綁定(這次假設Name綁定Textblock)并再次使用該元素,就像重新創建元素集那樣。不幸的是,Textblock從來沒有解除該綁定。現在如果讓數據變成可觀測的集合(必要情況下把匿名類型轉換為標準的類)并讓該集合觸發CollectionChanged事件(例如:Data[0]=Data[0]),一切運行正常。
以下的內存泄漏來自于jgoldb的微軟博客上:
如果初始HWND在XP上被撤銷就會導致CMilChannel泄漏
使用綁定的每條線程會導致ShutdownListener泄漏
在XP的HW中創建和消除WriteableBitmap
SW Viewport 3D w/ VisualBrush和WB等,都會在XP上引起泄漏問題
除了這些WPF內存泄漏以外,他還列出了一些其他的常見開發錯誤導致的內存泄漏,以及一些已修復的WPF問題。