我在WPF项目中遇到了巨大的内存泄漏,并试图弄清楚我可以做些什么来最小化它。要访问资源,我100%使用StaticResource。我应该尽可能使用DynamicResource吗?就StaticResource和DynamicResource之间的内存管理有优势吗?
仅供参考:我有一个列表框,通过DataTemplate显示数据。当用户向上/向下滚动时,内存增加很快,在向上/向下滚动的几分钟内达到1GB。
答案 0 :(得分:3)
这不太可能是StaticResource / DynamicResource的事情。静态和动态是指查找策略,而不是保留策略:
StaticResource意味着“查找 资源一次,然后继续使用 相同的价值。“
DynamicResource意味着“查找 资源每次需要时,在 值已更改。“
您正在做的事情因此听起来是正确的:使用StaticResource来取消资源,例如DataTemplates(并为可能更改的资源保留DynamicResource,例如,如果用户更改系统颜色方案,系统画笔可能会更改)。通过StaticResource引用分配DataTemplate将不会花费比通过DynamicResource引用分配它更多的内存,并且长期将更便宜,因为WPF不必继续返回并重新评估引用。
更有可能的是,模板本身正在做一些事情,当模板被应用(在数据项上实例化)时,它正在以漏洞的方式分配内存(或间接导致分配内存)。我见过的一个违反直觉的原因是模板是否使用旧式位图效果。另一个是如果模板调用代码隐藏事件来挂钩事件处理程序。但是这些都不会受到引用模板资源的方式的影响。
答案 1 :(得分:0)
据我所知,客户端的操作系统非常重要。
WPF旨在用于Vista及更高版本的系统(Windows 7)。您可能会遇到xp用户的性能问题。