最近將一個開發和維護了五年的一個Winform項目進行重構,考慮到最近很流行將用戶體驗掛在嘴上,因而採用了WPF技術,但願能在外觀和體驗上有一個全新的效果。windows
之前使用Winform的時候內存控制得不錯,軟件使用一天下來也就100M左右,如今使用WPF,十分鐘就達到了100M,在感慨WPF的胃口之餘也在思考怎樣將內存佔用量降下去。ide
首先寫了一個測試項目,放兩個窗體。第一個窗體放一個DataGrid,裏面綁定200條數據,第二個窗體放兩個測試按鈕,按鈕點擊代碼以下。測試
//打開20個測試窗口 List<TestWindow> windows = new List<TestWindow>(); private void Button1_Click(object sender, RoutedEventArgs e) { for (int i = 0; i < 20; i++) { var window = new TestWindow(); windows.Add(window); window.Show(); } } //關閉當前打開的測試窗口 private void Button2_Click(object sender, RoutedEventArgs e) { foreach (var item in windows) { item.Close(); } } //調用垃圾回收器,強制回收可用內存 private void Button3_Click(object sender, RoutedEventArgs e) { GC.Collect(); }
如今準備開始測試:優化
點擊Button1打開20個測試窗口,此時內存便達到了126M,點擊Button2,關閉全部測試窗體,內存110M,再次打開20個測試窗體,內存205M,關閉全部窗體,內存185M,條用垃圾回收,內存139Mthis
將程序稍微改動了一下,關閉測試窗體時,將數據上下文綁定(DataContext)賦值爲空,繼續測試spa
點擊Button1打開20個測試窗口,此時內存便達到了123M,點擊Button2,關閉全部測試窗體,內存110M,再次打開20個測試窗體,內存136M,關閉全部窗體,內存120M,條用垃圾回收,內存55Morm
進行了屢次測試,結果數據基本一致,爲了更直觀的對數據有一個比較,現將數據列表以下:blog
程序運行 | 打開20個測試窗體 | 關閉20個測試窗體 | 再次打開20個測試窗體 | 再次關閉20個測試窗體 | 強制垃圾回收 | |
關閉窗體時不作處理 | 17M | 126M | 110M | 205M | 185M | 139M |
關閉窗體時將DataContext賦空值 | 17M | 123M | 110M | 136M | 120M | 55M |
因此,結論只有一個,當咱們使用MVVM模式綁定DataContext或是直接給列表控件綁定數據源的狀況下,關閉窗體時,最好將綁定屬性賦一個空值內存
protected override void OnClosed(EventArgs e) { base.OnClosed(e); this.DataContext = null; }
之後會繼續博文,將親身經歷的WPF優化方案提出來,和你們一塊兒探討。ci