我有一个 WPF 应用程序,它很慢。
它不是渲染。首先,渲染非常简单,其次,我用 WPF Performance Toolkit 查看了它 - 没什么。
在我自己的代码中不。首先,单元测试运行速度很快,其次,如果我将所有 DataTemplates 替换为空白,一切都运行得很快。
到目前为止,看起来比较慢的部分是模板实例化。也就是说,当您启动应用程序并打开一些复杂的屏幕时,会花费很多时间。我所说的“很多”是指“很多”。有时可能长达 3-5 秒 - 例如,当有一个包含 100 行的数据网格时。但是,当您转到另一个选项卡,然后返回同一屏幕时,它会快速打开(只要其 View 模型保持原样)。
这很烦人,不仅因为它很慢,而且因为我对此无能为力。如果我能控制缓慢,我也许可以显示一些“正在打开,请稍候”消息或其他内容...
此外,当我查看其他一些 WPF 应用程序(最著名的是 ILSpy)时,尽管数据量很大,但它们似乎运行得相当快。这让我相信我可能做错了什么。但我不知道从哪里开始。
有什么想法吗?有什么经典错误吗?有什么建议吗?
最佳答案
我的经验来自于开发 WPF 思维导图应用程序 NovaMind
几个月前,我们完全重写了中间层以解决我们遇到的性能问题。简而言之,创建我们的用户控件似乎是减慢速度的方式。不幸的是,我找不到一个很好的方法来分析性能,因为 WPF Performance Suite 和商业应用程序(如 ANTS Profiler)都没有为您提供有关 WPF 过程的这一部分的任何详细信息。 (我当时问过this question)
我们通过反复试验来手动测试我们的应用程序,并删除了我们的部分用户控件,以查看究竟是什么是罪魁祸首。
最后,我们通过完全重写控件解决了性能问题。我们还大大降低了视觉树的复杂性。在重写之前,我们最常用的用户控件之一,当使用 Snoop 检查时,包含 61 个不同的东西,现在只有 3 个。只要有可能,我们只按需向可视化树中添加东西。 (如您所知,在 XAML 中,即使将内容设置为 Collapsed,也需要先创建它们)。 最后,我们被迫编写自己的富文本呈现控件,因为内置的 RichtextBox 速度非常慢,而且 RichtextBox 的可视化树非常复杂。
我不知道这是否适用于您的情况,但我建议您调查您的用户控件并查看它们是否复杂。也许你有可以修剪的东西。 低垂的果实将是很少见的部分,或者可以以懒惰的方式创建。您可以在必要时从代码隐藏创建这些部分,而不是将它们放在 XAML 中。这应该对您有很大帮助。
否则,如果可能的话,虚拟化是你的 friend 。不幸的是,我们无法做到这一点。
关于c# - WPF:缓慢的模板实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5790380/