1

это, вероятно, только некоторые концептуальные проблемы, но я не могу найти идеальное решение.Как синхронизировать клиенты Silverlight с WCF?

Я хотел бы создать клиентское приложение Silverlight, которое использует WCF для управления сторонним приложением через собственный автономный веб-сервис. Если есть более одного клиента Silverlight, все клиенты должны быть синхронизированы, то есть изменения параметров от одного клиента должны распространяться на всех клиентов.

Я создал очень простой Silverlight GUI, который манипулирует параметры, которые передаются на сервер (класс наследует INotifyPropertyChanged):

public double Height 
    { 
     get { return frameworkElement.Height; } 
     set 
     { 
      if (frameworkElement.Height != value) 
      { 
       frameworkElement.Height = value; 
       OnPropertyChanged("Height", value); 
      } 
     } 
    } 

OnPropertyChanged отвечает за передачу данных. Служба WCF (duplex net.tcp) поддерживает список всех клиентов, и как только он получает пакет данных (XElement с описанием изменения параметра), он пересылает этот самый пакет всем клиентам, кроме того, из которого был получен пакет.

Клиент получает пакет, но теперь я не уверен, что лучший способ установить свойство внутри. Если я использую «Высота» (см. Выше), новое сообщение об изменении будет сгенерировано и отправлено всем другим клиентам a.s.o.

Возможно, я мог бы использовать поле данных (frameworkElement.Height) или функцию, но я не уверен, возникнут ли проблемы с привязкой данных позже. Также я не хочу просто копировать части свойств кода, чтобы предотвратить ошибки с избыточным кодом.

Итак, что бы вы посоветовали?

Спасибо!

ответ

1

Одним из распространенных решений здесь является использование булева для отслеживания текущего состояния внутри OnPropertyChanged. Он может быть установлен в true, когда принимается пакет WCF, и если это правда, вы не ретранслируете. Затем вы устанавливаете значение false после установки свойства.

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

Эта опция работает, но для этого требуется осторожность. Поскольку вы ставите эту логику в одну точку, она должна быть довольно простой, чтобы получить правильное решение.

+0

Whow - очень быстрая реакция, спасибо! Я думал об этом решении, но я боялся, что могут возникнуть проблемы с многопоточным процессом. – JeffRSon

+0

@ user564226: могут быть проблемы - хотя в общем, в Silverlight это минимально. Вам нужно будет позаботиться о правильной синхронизации, но опять же, поскольку все это обрабатывается в рамках одного метода, его обычно довольно легко обрабатывать. –

+0

@ user564226: Вероятно, для блокировки нескольких потоков может потребоваться одна блокировка, если вы используете несколько потоков здесь. –

Смежные вопросы