WPF優化體驗<一>

最近將一個開發和維護了五年的一個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

相關文章
相關標籤/搜索