2012-03-20 42 views
3

如果你解析300个字节的原始数据的20倍,第二个成一束WPF控件的属性,将您的解决方案是什么呢?从轮询转为事件的最佳方式是什么?

更具体地说,我有一个支持MODBUS-PLC,我需要做一个WPF HMI控制它。 Modbus是一种通信协议,要求轮询数据更改。相比之下,WPF和.NET Framework通常促进事件驱动模型,因此将数据直接推入控件每秒20次对我来说似乎并不自然。 Modbus不仅缺乏报告数据变化的方法,而且它也不提供字节的高级表示,并且开发人员需要将一系列未签名的短片适当地分解为有意义的内容。

在解析这些数据是没有什么大不了的我,来了一个正确的转换一堆启用事件DependencyProperties的(绑定假定数据)是具有挑战性的。我不想有很多初始化代码或临时存储来监视更改。

回答

2

将没有必要把你的周期性调查数据转化为依赖属性。这样的数据属性只会被用作绑定的来源,所以将它们放在实现INotifyPropertyChanged的类中就足够了。

我建议收集的约10轮询周期数据,并更新数据属性每秒不超过两次。你一定会轮询一个单独的线程,所以你应该确保你通过Dispatcher.BeginInvoke调用UI线程上PropertyChanged事件就像下面的代码:

public class DataCollector : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private byte[] someData; 

    public byte[] SomeData 
    { 
     get { return someData; } 
     set 
     { 
      someData = value; 

      if (PropertyChanged != null) 
      { 
       Application.Current.Dispatcher.BeginInvoke(PropertyChanged, this, new PropertyChangingEventArgs("SomeData")); 
      } 
     } 
    } 
} 
+0

使用INotifyPropertyChanged的好点,THX(需要一种方法尽管检索更新的属性)。但是,预收集数据或限制更新频率会在UI中引入显着的滞后,即,当用户点击阀以打开它时,为了记录目的和UI响应性,其状态改变必须尽可能快地反映出来。 – Yegor 2012-03-20 10:31:38

+0

有关检索一个细节......我不希望让所有的数据点单独的属性(也有几十人分析后)。 – Yegor 2012-03-20 10:39:19

+0

对于第一点,每秒更新UI 20次应该没有问题。第二点,您可以继续使用所有数据点作为成员的数据类,并将其用作数据属性的类型。 – Clemens 2012-03-20 10:46:32

相关问题