WPF优化体验<一>

最近将一个开发和维护了五年的一个Winform项目进行重构,考虑到最近很流行将用户体验挂在嘴上,于是采用了WPF技术,希望能在外观和体验上有一个全新的效果。

以前使用Winform的时候内存控制得不错,软件使用一天下来也就100M左右,现在使用WPF,十分钟就达到了100M,在感慨WPF的胃口之余也在思考怎样将内存占用量降下去。

首先写了一个测试项目,放两个窗体。第一个窗体放一个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,条用垃圾回收,内存139M

将程序稍微改动了一下,关闭测试窗体时,将数据上下文绑定(DataContext)赋值为空,继续测试

点击Button1打开20个测试窗口,此时内存便达到了123M,点击Button2,关闭所有测试窗体,内存110M,再次打开20个测试窗体,内存136M,关闭所有窗体,内存120M,条用垃圾回收,内存55M

 进行了多次测试,结果数据基本一致,为了更直观的对数据有一个比较,现将数据列表如下:

  程序运行 打开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优化方案提出来,和大家一起探讨。

posted @ 2014-10-31 16:15  idongfeng  阅读(2180)  评论(14编辑  收藏  举报