2013-03-05 2 views
3

проблема довольно проста: В основном мой вид должен отображать данные, поступающие из службы WCF. Данные обновляются асинхронно с высокой частотой, поэтому графический интерфейс должен быть соответствующим образом обновлен при изменении данных на стороне сервера.Дизайн MVVM для приложения реального времени

В представлении отображается много данных, поэтому в основном это привязывает поля 50/60, выставленные в ViewModel.

Модельная часть - это в основном объект POCO, который содержит поля 50/60, отображаемые в графическом интерфейсе. Да, ViewModel подвергает объект Model объекту View. (Обратите внимание, что объект Model реализует INotifyPropertyChanged, чтобы уведомить View, когда изменилось значение свойства.)

Теперь я написал слой «DataService», который взаимодействует с сервисом WCF и отвечает за обновление модели в соответствии с к данным, возвращаемым службой WCF. Когда данные обновляются на стороне сервера, служба WCF по причинам производительности возвращает клиенту только набор полей, которые изменены.

Так, в DataService есть обработчик событий, который управляет обновления службы WCF, как следующее:

void OnServiceUpdated(UpdateArgs args) 
{ 
    foreach(Field field in args.ChangedFields) 
    { 
     if(field.Key == "BetName") _modelBet.BetName = field.Value; 
     else if(field.Key == "BetUser") _modelBet.BetUser = field.Value; 
     [...] 
     //the same for 50 fields... 
    } 
} 

Теперь этот ужасный код, который обновляют модель необходима, потому что мы хотим обновить только те поля, модели, которые не изменены на стороне сервера. (Обратите внимание, что API-интерфейс службы wcf не может быть изменен).

Мой вопрос: Что вы предлагаете, чтобы улучшить производительность обработчика OnServiceUpdated?

Спасибо заранее, Jhon

ответ

2

Вы говорите, «Данные обновляются асинхронно с высокой частотой»

Как я понимаю, вы не хотите, частое воздействие на UI. Таким образом, вы можете использовать таймер диспетчера для оповещения. Он работает с потоком пользовательского интерфейса, отличным от других таймеров.

http://msdn.microsoft.com/tr-tr/library/system.windows.threading.dispatchertimer.aspx Вот ответ пользователя SO https://stackoverflow.com/a/15044392/413032 об этом.

Если вы используете MVVM, так что если бы я был вами, я сделал args.ChangedFields именами и именами свойств ViewModel равными. Итак, отражение или с помощью auto-mapper Я могу передать значения свойств для просмотра свойств модели.

Вы также можете настроить параметры отображения событий и обновления после того, как настроены все свойства.

Для обеспечения этого;

Как я понимаю, вы используете связывание так связывание имеет режимов и варианта UpdateSourceTrigger так что вы можете updatesouce явно.

http://msdn.microsoft.com/en-us/library/cc278072(v=vs.95).aspx#updating_the_data_source http://msdn.microsoft.com/en-us/library/system.windows.data.updatesourcetrigger.aspx

Надежда показать вам путь.

+0

Привет, Давут, большое спасибо за ваш ответ. Хорошо, спасибо за предложение Dispatcher TImer, но частые обновления в пользовательском интерфейсе не являются проблемой в этом случае. – user1070316

+0

Привет, Давут, большое спасибо за ваш ответ. Хорошо, спасибо за предложение диспетчера TImer, но частые обновления в пользовательском интерфейсе не являются проблемой в этом случае. Кстати, я буду рассматривать эту проблему отдельно. Да, я уже придумал решение, которое вы предложили, поэтому, используя отражение для того, чтобы свойства свойства transer отображали свойстваModel, но по соображениям производительности я бы хотел избежать использования отражения. Очень интересно ваше предложение об Auto-Mapper. Я попытаюсь разобраться в этом направлении. Thanks, John – user1070316

+0

Некоторые люди говорят, что этот метод http://stackoverflow.com/a/8111631/413032 работает быстрее, чем отражение. Кроме того, я не думаю, что размышление вызывает проблемы. Связывание использует отражение и 1000 объектов Textblock в элементе управления, привязанных к 1 секунде http://msdn.microsoft.com/en-us/library/bb613546.aspx (время рендеринга 1.2sn). Уверены, что вы свободны от использования автомакетов http://www.codeproject.com/Articles/61629/AutoMapper. Это действительно зависит от вашей проблемы. –