优化智能客户端性能

时间:2010-03-14 01:04:00

标签: c# wpf winforms wcf web-services

我有一个智能客户端(WPF),可以调用服务器va服务(WCF)。我正在处理的屏幕包含一个在调用构造函数时加载的对象列表。我可以在列表中添加,编辑和删除记录。

通常我正在做的是在每次添加或删除之后我再次从服务重新加载整个模型,这有很多原因,包括服务之间服务器上的数据可能已经发生了变化。

这种方法在性能方面受到了很大的打击,因为我在加载和编辑时加载所有发送列表的内容。

我还有哪些其他选项,我应该只将所需信息发送到服务器吗?如果执行添加或删除操作,我将如何重新加载所有数据呢?

2 个答案:

答案 0 :(得分:1)

执行您所描述的内容的最佳方式(我将假设您已知客户端/服务器I / O已成为瓶颈)是在客户端填充后仅发送两个方向的更改。 / p>

如果您已采用日记模型来更新数据,则可以直截了当。为了使任何进程对共享数据进行更改,它必须创建一个添加到日志中的带时间戳的事务。数据更新是通过将事务应用于数据的方法完成的。

一旦您的数据模型支持事务日志,您就可以通过简单的方式使客户端和服务器保持最小的网络流量同步:为了更新客户端,服务器会发送自创建以来已创建的所有日记条目上次客户端更新。

这可能需要大量工作才能改进现有设计。在你走这条路之前,你想确定你想要解决的问题实际上是你遇到的问题。

答案 1 :(得分:-1)

  1. 确保此功能封装良好,因此您无需触摸其他组件即可使用它。
  2. 让您的来源受版本控制并经常办理登机手续。
  3. 我强烈建议您使用一套自动单元测试来验证在重构之前一切都按预期工作,并在执行每次更改时继续工作。
  4. 如果性能影响是在服务器 - >客户端传输数据,而不是服务器上的查询,处理和磁盘IO,您可以考虑设计给定集合或对象图的散列,并传递哈希到服务器上的服务方法,它将从数据库中查询和计算哈希值,比较哈希值,然后返回truefalse。只有在您false时才会重新加载数据。如果更改不太可能或不经常发生,这是有效的,因为它需要两次调用来获取数据,当数据发生变化时。如果数据库中的更改是一个问题,您可能不希望仅在用户修改或添加某些内容时获取更改 - 例如,这可能是基于计时器的完全独立的操作。您的并发策略实际上取决于您的数据,用户数量,多个用户有兴趣同时更改相同数据的可能性等。