【发布时间】:2010-11-24 03:06:32
【问题描述】:
我有一个 WPF 应用程序 (.NET 4),它有一个主窗口,在该主窗口内显示了许多较小的 UserControls。用户执行的各种操作会导致显示的UserControls 被具有不同数据的不同其他控件替换。
但是,在切换这些控件时,我遇到了性能问题。 WPF 调度程序线程在加载控件时进入 100% CPU。在较旧的机器上,或具有大量控件的情况下,这可能会导致应用程序似乎锁定长达 30 秒!
分析表明,几乎所有这些 CPU 时间都用于调用所有不同 UserControls 的各种 InitializeComponent 方法 - 没有一个控件似乎比其他任何控件都差得多,它们似乎都在 0.2 和 0.5 之间秒(在我的具有快速处理器和良好显卡的开发机器上)。
据我所知,InitializeComponent 是 WPF 实际将编译后的 xaml 加载到内存中的位置。
我不知道在这里做什么。我想在后台线程上预初始化,但所有 WPF 控件都必须在调度程序线程上创建和使用,所以我认为这是不可能的。
否则,我唯一的选择似乎是删除我所有的 xaml??
任何帮助将不胜感激
【问题讨论】:
-
在不了解您的应用程序的更多信息(具体细节 + 代码)的情况下,我只能想象您要么拥有大量的用户控件 (+50) 和/或非常繁重的数据绑定。所以唯一的答案是重新设计你的应用程序逻辑。您还必须了解的是,当涉及大量控件/数据时,WPF 绝对是垃圾,因为它严重未优化(我想它的框架级别太高了)。也许为您的应用程序尝试 WinForms(更好一点)或用原生 c++/directx 编写所有内容(a'la Photoshop,AutoCAD 风格)
-
jeremiahmorrill.wordpress.com/2011/02/14/… - 我猜控件正在加载,渲染生成并可能被缓存。它确实提到了您可能想尝试的 PIX(一种 WPF 性能工具)。
标签: c# wpf performance