WPF - 动态资源 vs 静态资源

4

我在我的WPF项目中遇到了一个严重的内存泄漏问题,正在尝试找出如何最小化它。我100%使用StaticResource来访问资源。是否应该在可以的情况下使用DynamicResource呢?在StaticResource和DynamicResource之间,从内存管理方面有什么优劣势吗?

顺便说一下:我有一个通过DataTemplate显示数据的listbox。当用户上下滚动时,内存迅速增加,在几分钟内就达到1GB。

2个回答

5
这不太可能是StaticResource / DynamicResource的问题。 Static和dynamic指的是查找策略,而不是保留策略:
- StaticResource表示“查找资源一次,然后持续使用相同的值”。 - DynamicResource表示“每次需要时查找资源,以防值已更改”。
因此,你现在的做法是正确的:对于不变的资源,例如DataTemplates,请使用StaticResource(并将DynamicResource保留用于可能更改的资源,例如系统画笔,如果用户更改系统颜色方案,则该画笔可能会更改)。通过StaticResource引用分配DataTemplate不会消耗比通过DynamicResource引用分配更多的内存,并且从长远来看,将更加便宜,因为WPF不必返回并重新评估引用。
更有可能的是,您的模板本身正在执行某些操作,当应用模板(在数据项上实例化)时,会以泄漏的方式分配内存(或间接导致分配内存)。 我见过这种情况的一个反直觉原因是,如果模板使用旧式位图效果,另一个原因是,如果模板调用代码后端来连接事件处理程序。 但这两种情况都不太可能受到您引用模板资源的方式的影响。

0
据我所知,客户端的操作系统非常重要。
WPF是为Vista及更高版本的系统(Windows 7)设计的。您可能会在XP用户中遇到性能问题。

WPF是为Longhorn而设计的,而不是Vista。 WPF也早于Windows Vista,因为它正式随Visual Studio 2005一起发布,而这比Windows Vista早了一年以上。 WPF基于DirectX 9(即使在Windows 10上仍然如此,您需要跳过许多障碍才能与DirectX 10和11进行接口交互,并且由于其根本不同的设计,DX12是不可能的)。 - Dai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接