我们有一个 5 年前开始开发的金融应用程序。它是旧应用程序的迁移,主要目的是实现良好的用户界面。由于 UI 考虑,当时选择的技术是 WPF。该应用程序仍然使用带有 SP1 的 .Net 3.5 版。当前的应用程序是分层的,但业务逻辑和后端是不同的技术,超出了我们的问题范围。客户端不是传统的 MVVM 应用程序,但是它混合了一些概念。
在一个简单的场景中,数据以类型化数据集的形式从应用服务器检索。发送到客户端的数据集映射到实现 INotifyPropertyChanged 接口的数据对象 (POCO),属性引发 PropertyChanged 事件。这些数据对象实际上绑定到 UI,并且作为对用户交互的响应,一些路由命令被执行,因此最终从服务器检索数据。实现了 Active Record 模式的一种变体,因此基本上从服务器接收到的数据集中的每个表都映射到一个数据对象中,数据对象中的一个属性表示表中的列,数据对象实例表示表中的一行。由于使用了 WPF 绑定,检索到的数据会自动出现在 UI 上。
问题是我们开始遇到性能问题。从服务器检索数据后,它们有时会以不确定的方式出现。从数据集映射开始到 UI 更新之间存在延迟。慢速机器上的延迟可能长达几秒钟。在功能强大的机器上,延迟似乎微不足道。此外,延迟不是恒定的,因此检索相同的数据时,UI 有时会在几毫秒内更新,有时会持续几秒钟。
我们认为我们已经隔离了问题,它是在绑定源(数据对象)具有许多属性(例如:50)并且 UI 包含许多使用绑定的控件(文本框)的情况下使用绑定。还使用不同的工具进行了一些测量。似乎没有内存泄漏。在更新参与绑定的数据对象的属性时可以看到处理延迟。似乎设置属性值的持续时间也取决于值本身(例如:使用零值更新十进制属性更快,在绑定上使用或不使用转换器,测试也是在没有转换器和字符串的情况下进行的,属性值字符串“0”的更新速度比属性值“123.456.00”快得多)。
所以基本上我们认为性能问题的主要部分是在 UI 上使用许多控件(例如:150 个文本框)绑定到具有许多属性的对象(例如:50)。我们注意到,以 3.5 版本为目标比以 4.0 或 4.5 版本为目标要慢得多。延迟可以重现,但并非一直都在发生。延迟以指数方式增加或减少,例如从 5 毫秒到 2 秒,或者在非常慢的机器上甚至高达数十秒。
我们怀疑性能问题(延迟到 UI 更新)与 WPF 技术和绑定机制有关,但尚未得到证实。
所以基本上我们不明白为什么会出现延迟,为什么它们只出现有时(非确定性)以及它们是否是因为 WPF 绑定系统!
对此的任何帮助将不胜感激。谢谢你。