.net - 从轮询更改为事件的最佳方式是什么?

标签 .net wpf events polling modbus

如果您每秒 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/

相关文章:

c# - 如何加粗标签的一部分?

jQuery 和闭包

ios - 在 Mobile Safari 上退出全屏后停止视频

.net - 供应商特定的MIME作为传入WCF REST POST请求中的Content-Type(例如application/vnd.company + xml)

c# - 制定通用和特定的 stub 方法?

c# - 通过线程池内的定时器执行方法

c# - Item PropertyChanged 不适用于 observableCollection。为什么?

c# - 从架构上讲,我应该如何用更易于管理的东西替换一个非常大的 switch 语句?

c# - 将 UserControl 中元素的属性绑定(bind)到 MyViewModel.cs 中的属性

c# - 接收 : How to buffer events (ring buffer) and only flush them when a special event occurs?