从民意调查转变为事件的最佳方式是什么?

时间:2012-03-20 09:08:05

标签: .net wpf events polling modbus

如果要将每秒20次的300字节原始数据解析为一堆WPF控件属性,那么您的解决方案是什么?

更具体地说,我有一个支持Modbus的PLC,我需要制作一个WPF HMI来控制它。 Modbus是一种通信协议,需要轮询数据更改。相比之下,WPF和.NET Framework通常会促进事件驱动模型,因此将数据每秒20次直接推送到控件中对我来说似乎不自然。 Modbus不仅缺乏报告数据变化的方法,而且还没有提供高级别的字节表示,开发人员可以将无符号短路数组正确地分解为有意义的短语。

虽然解析这些数据对我来说没什么大不了的,但是对于一堆启用事件的DependencyProperties(假定的数据绑定)进行适当的转换是一项挑战。我不希望有很多初始化代码或临时存储来监视更改。

1 个答案:

答案 0 :(得分:2)

没有必要将循环轮询数据放入依赖属性中。此类数据属性仅用作绑定源,因此将它们放在实现INotifyPropertyChanged的类中就足够了。

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

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"));
            }
        }
    }
}