Как лучше всего перейти от опроса к событиям? - PullRequest
3 голосов
/ 20 марта 2012

Если бы вам пришлось анализировать 300 байтов необработанных данных 20 раз в секунду в кучу управляющих свойств WPF, каким было бы ваше решение?

Точнее, у меня есть ПЛК с поддержкой Modbus, и мне нужносделать WPF HMI для управления им.Modbus - это протокол связи, который требует опроса на предмет изменений данных.Напротив, WPF и .NET Framework в целом поддерживают модель, управляемую событиями, поэтому передача данных 20 раз в секунду непосредственно в элементы управления кажется мне неестественной.Modbus не только не имеет средств для сообщения об изменениях данных, но и не обеспечивает высокоуровневое представление байтов, и разработчик должен правильно распределить массив неподписанных шорт во что-то значимое.

При анализе таких данныхДля меня нет ничего сложного, придумать правильное преобразование в группу DependencyProperties с включенными событиями (предполагается привязка данных) сложно.Я не хотел бы иметь много кода инициализации или временного хранилища для отслеживания изменений.

1 Ответ

2 голосов
/ 20 марта 2012

Нет необходимости помещать ваши циклически опрашиваемые данные в свойства зависимостей.Такие свойства данных будут использоваться только в качестве источника привязок, поэтому было бы достаточно иметь их в классе, который реализует INotifyPropertyChanged .

. Я бы предложил собрать данные о 10 циклах опроса.и обновлять свойства данных не более двух раз в секунду.Вы непременно будете опрашивать в отдельном потоке, поэтому вам следует убедиться, что вы вызываете событие PropertyChanged в потоке пользовательского интерфейса с помощью 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"));
            }
        }
    }
}
...