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

时间:2014-11-19 15:55:23

标签: c# wpf multithreading performance

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

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

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

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

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

现在我首先要问的是后台会发生什么,以及为什么这种延迟如此之大,以及可以采取哪些措施来提高启动速度。

我没有提到但是在发布过程中没有Exceptions或DataErrors,所以它是 与例外无关。

我认为它是Buttons和其他组件的初始化,因为几乎所有组件都重新调整了ControlTemplate。

2 个答案:

答案 0 :(得分:2)

需要加载很多程序集,在显示第一个窗口之前,必须对许多代码进行JIT编译。减少启动时间的一种有用技术是以这样的方式构造代码,即在需要之前不加载类型。在钻研核心WPF程序集之外的代码之前,可能最好在屏幕上显示带有等待指示器的空白窗口。优化该方案。

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

避免同步加载任何数据,并在视图中尽可能少地查看模型构造函数。推迟加载数据,直到显示视图(必要时抛出等待指示符)。

如果您认为您的Xaml资源存在问题,请将其拆分,并让每个视图仅提取所需的资源。不要将它们合并到App.xaml。您还可以查看如何在多个视图中share the resources more efficiently

Throwing up a splash screen可以改善感知的启动时间。在屏幕上显示任何以让用户知道您的应用实际上正在做一些事情。

最后,不要担心太多;糟糕的启动时间是WPF应用程序的标志,最终,你只能做很多事情。

答案 1 :(得分:0)

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