none
界面加载数据太耗内存,有什么好的处理策略 RRS feed

  • 问题

  • 我们的软件用的是wpf,mvvm的形式加载;软件主界面通过UserControl加载数据(可加载多份,通过切换显示,当前只显示一份),UserControl上有多个Tab控件,Tab控件上一般有1-2个DataGrid。现在的问题是,加载20-30M的数据到UserControl上,系统会吃掉200M的内存,有什么方法可以降低内存的消耗?

    如果同时加载多个UserControl(切换时已使用SetProcessWorkingSetSize),明显感觉软件卡顿(tab控件间的切换、DataGid上行的切换),就算是配置很好的电脑也有这个现象(8G内存)。

    使用SetProcessWorkingSetSize后虽然降低了内存使用,但是对软件性能并没有改观。

    • 已编辑 liactor 2014年7月2日 6:46
    2014年7月2日 5:46

答案

全部回复

  • 你好,

    1. 这20-30M数据是否必须一次性加载到界面上,如果没必要一次加载,请需要时再请求;

    2. 首先在内存中维护数据,需要消耗一定的内存,例如从普通的数据格式到XML数据格式;

    3. 因为我没有见到具体的代码,在你的帖子中提到了Tab切换,在Tab切换时,我们可以清理一部分内存。

    CloseTabCommand = new RelayCommand<TabItem>(tab =>
    {
        if (null == tab) return;
    
        tab.DataContext = null;
    
        ListTabItem.Remove(tab);
    },
    tab =>
    {
        return ListTabItem.IndexOf(tab) == CurrentTabItemIndex;
    });

    请参考:http://stackoverflow.com/questions/10438232/customizing-tabitem-closeable-tab-and-release-memory-on-close

    另外一个,数据虚拟化,

    http://www.codeproject.com/Articles/34405/WPF-Data-Virtualization

    http://social.msdn.microsoft.com/Forums/vstudio/en-US/8e6ef1bb-0da3-41ed-89d6-1d995212df16/loading-wpf-datagrid-asynchronously

    谢谢!


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年7月3日 5:19
    版主
  • 你好,上面可能描述的不清楚,是这样的。

    1、软件主界面是TabControl,有6个tab,每个tab上有工具栏、表格、tabcontrol、按钮等很多控件

    2、软件可以打开多个工程(MDI),每个工程对应一个TabControl

    3、每个工程中数据比较大,目前是一下子放到内存里面去

    现在的主要问题是尤其是性能比较差的计算机,比如内存1G:

    1、切换tab时速度比较慢,打开多个工程后甚至表格中切换行(没有其他多余的操作),切换菜单Item时也卡,即使是8G的内存

    2、打开多个工程后内存消耗过大

    另外,需要提供其他什么内容更有助于您判断问题,有些内容不方便直接附件,是否可以给你邮件。

    请问下有没有好的解决办法,谢谢。

    2014年7月4日 6:03
  • 1、DataGrid 可见时绑定,不可见时取消绑定。

    2、在 DataGrid 中分页。

    2014年7月4日 6:11