如果您每秒 20 次将 300 字节的原始数据解析为一堆 WPF 控件属性,您的解决方案是什么?
更具体地说,我有一个支持 Modbus 的 PLC,我需要制作一个 WPF HMI 来控制它。 Modbus 是一种需要轮询数据更改的通信协议(protocol)。相比之下,WPF 和 .NET Framework 通常提倡事件驱动模型,因此每秒 20 次将数据直接推送到控件中对我来说似乎不自然。 Modbus 不仅缺乏报告数据更改的方法,而且它不提供字节的高级表示,并且需要开发人员将一组无符号短整型正确解析为有意义的内容。
虽然解析此类数据对我来说没什么大不了的,但正确转换为一堆启用事件的 DependencyProperties(假定数据绑定(bind))却很困难。我不希望有大量的初始化代码或临时存储来监视更改。
最佳答案
无需将循环轮询的数据放入依赖属性中。此类数据属性仅用作绑定(bind)源,因此将它们放在实现 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"));
}
}
}
}
关于.net - 从轮询更改为事件的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9783937/