3

问题很简单:基本上我的视图应该显示来自 WCF 服务的数据。数据异步更新的频率很高,所以当服务器端的数据发生变化时,应该相应地更新GUI。

View 显示了很多数据,所以基本上它绑定了 ViewModel 中公开的 50/60 字段。

模型部分基本上是一个 POCO 对象,其中包含 GUI 中显示的 50/60 字段。是的,ViewModel 将 Model 对象暴露给 View。(请注意,模型对象实现了 INotifyPropertyChanged,以便在属性值更改时通知视图。)

现在,我编写了一个与 WCF 服务交互的“DataService”层,它负责根据 WCF 服务返回的数据更新模型。当数据在服务器端更新时,WCF 服务出于性能原因仅将更改的字段集返回给客户端。

因此,在 DataService 中有一个事件处理程序来管理 wcf 服务更新,如下所示:

void OnServiceUpdated(UpdateArgs args)
{
  foreach(Field field in args.ChangedFields)
  {
      if(field.Key == "BetName") _modelBet.BetName = field.Value;
      else if(field.Key == "BetUser") _modelBet.BetUser = field.Value;
      [...]
      //the same for 50 fields...
  }
}

现在需要这个更新模型的可怕代码,因为我们只想更新模型中没有在服务器端更改的字段。(注意 wcf 服务 API 不能更改)。

我的问题是:为了提高“OnServiceUpdated”处理程序的性能,您有什么建议?

在此先感谢,约翰

4

1 回答 1

2

你说“数据异步更新的频率很高”

据我了解,您不希望对 UI 产生频繁的影响。因此,您可以使用调度程序计时器进行延迟通知。它适用于 UI 线程,与其他计时器不同。

http://msdn.microsoft.com/tr-tr/library/system.windows.threading.dispatchertimer.aspx 这是 SO 用户https://stackoverflow.com/a/15044392/413032的回答。

如果您使用 MVVM,那么如果我是您,我将args.ChangedFields名称和我的 ViewModel 属性名称设置为相等。因此,通过反射或使用自动映射器,我可以将属性值传输到 viewModel 属性。

您还可以在所有属性设置后生成事件并更新 UI。

提供这个;

据我了解,您使用绑定,因此绑定具有模式和updatesourcetrigger选项,因此您可以显式更新源。

http://msdn.microsoft.com/en-us/library/cc278072(v=vs.95).aspx#updating_the_data_source http://msdn.microsoft.com/en-us/library/system.windows.data。更新源触发器.aspx

希望给你一个方法。

于 2013-03-05T06:18:23.150 回答