启动 WPF 应用程序时出现性能问题

本文关键字:性能 问题 WPF 应用程序 启动 | 更新日期: 2023-09-27 18:31:05

我有一个复杂的WPF应用程序,它使用了共享资源字典中的大量资源。初始化的第一个窗口需要 8 秒才能初始化。SSD 磁盘驱动器上的性能问题较少,但仍需要 2 秒。

我尝试使用Visual Studio Profiler,它在InitializeComponent()上显示了大量的时间费用;需要显示的窗口。

我相信它与使用的资源字典有关,但我无法替换它,因为我确实需要它,并且因为所有窗口和 WPF 元素都使用 StaticResource 引用。

我试图尽可能优化发射。我创建了许多后台线程,但这并没有太大帮助。每当需要显示窗口时,都必须将其附加到同一调度程序下的 UI 线程上。这会产生很大的性能问题,屏幕上留下的所有 UI 和任何进度条都会被阻止。

所以总结一下。从调用 ShowDialog 到显示窗口为止需要 8 秒。这仅在第一个窗口中可见。在此之后打开的任何其他窗口都会快速显示。

现在我首先要问的是后台发生了什么,为什么延迟如此之大,其次可以做些什么来提高启动速度。

我没有提到,但在启动期间没有异常或数据错误,所以它是与异常无关。

我相信这是按钮和其他组件的初始化,因为几乎所有组件都重新设计了控件模板。

启动 WPF 应用程序时出现性能问题

需要加载大量程序集,并且必须对大量代码进行 JIT 编译,然后才能显示第一个窗口。 减少启动时间的一种有用技术是,以这样一种方式构建代码,即在需要类型之前不会加载类型。 最好在屏幕上显示一个带有等待指示器的空白窗口,然后再深入研究核心 WPF 程序集之外的代码。 针对该方案进行优化。

如果您试图尽快在屏幕上显示某些内容,请避免过早加载图像/媒体和其他资源。

避免同步加载任何数据,并尽可能少地在视图和视图模型构造函数中执行任何操作。 延迟加载数据,直到显示视图(如有必要,请抛出等待指示器)。

如果你认为 Xaml 资源有问题,请拆分它们,并让每个视图仅拉入所需的资源。 不要将它们合并到App.xaml 中。 您还可以研究如何在多个视图之间更有效地共享资源。

引发初始屏幕可以缩短感知的启动时间。 在屏幕上显示任何内容以让用户知道您的应用实际上正在做某事,这有很长的路要走。

最后,不要太担心;糟糕的启动时间是 WPF 应用程序的标志,最后,您能做的只有这么多。

您还可以使用 ProfileOptimization 类来缩短程序后续会话的启动时间。可能对开发人员没有帮助,但可能会对您的用户产生更好的影响。