Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF多数据网格导致内存问题_C#_Wpf_Datagrid_Memory Leaks - Fatal编程技术网

C# WPF多数据网格导致内存问题

C# WPF多数据网格导致内存问题,c#,wpf,datagrid,memory-leaks,C#,Wpf,Datagrid,Memory Leaks,我的WPF项目有一个tabcontrol,它承载多个datagrid控件。每个datagrid包含大约1000行,用户希望同时打开10个以上的datagrid,每个datagrid都位于不同的选项卡页中 问题是,由于内存不足异常,我的应用程序将在第5-6个数据网格处崩溃。经过数小时的研究,我发现解决这个问题的唯一可行方法是启用UI虚拟化。但是,这不是一个选项,因为我需要平滑滚动数据网格,启用UI虚拟化将禁用平滑滚动 另一个解决方案是将滚动单位改为像素,而不是基于项目。但是,在我的情况下,这也不是

我的WPF项目有一个tabcontrol,它承载多个datagrid控件。每个datagrid包含大约1000行,用户希望同时打开10个以上的datagrid,每个datagrid都位于不同的选项卡页中

问题是,由于内存不足异常,我的应用程序将在第5-6个数据网格处崩溃。经过数小时的研究,我发现解决这个问题的唯一可行方法是启用UI虚拟化。但是,这不是一个选项,因为我需要平滑滚动数据网格,启用UI虚拟化将禁用平滑滚动

另一个解决方案是将滚动单位改为像素,而不是基于项目。但是,在我的情况下,这也不是一个选项,因为我被限制在.NET Framework 4.0中运行应用程序。该功能仅在4.5中可用

另外,我很确定是行导致了内存问题,因为如果我在没有datagrid的情况下运行应用程序,我可以轻松加载多达100个viewmodels


我想的是,我是否可以临时处理在不可见的选项卡页中创建的控件,并仅在用户导航到相应的选项卡页时创建它们?还有别的办法吗

不使用数据网格会有所帮助

虽然这样的控件使用起来很方便,但事实是它们远远不是轻量级的

屏幕一次可容纳约30行,因此无需使用数千行来污染内存,将更多行加载到某些数据集后,可以平滑滚动,因为您将向网格提供预取的数据


如果数据没有不断变化,您甚至可以在临时文件中创建脱机缓存。

IIRC虚拟化不应阻止平滑滚动,事实上,它应该改进滚动,因为相同的UI元素可以回收,我认为最好的实现方法是在Active/Deactive选项卡上加载和卸载网格。为什么你要一次加载所有的网格。既然你已经取消了虚拟化的资格,除了改变ui的工作方式之外,什么也做不了。如果这确实导致了内存不足异常,而不是处理泄漏,那么就开始分析使用最多内存的UI或数据对象。数据对象是否有对可能变为惰性的其他对象的引用?还有一件事-你说的是ViewModels…是每个数据行一个,还是每个数据上下文一个?我很确定是UI造成了内存问题。每个datagrid有一个datacontext/VM,VM没有太多嵌套的子对象,因此我怀疑数据对象是原因。