1

이것은 아마도 개념적인 문제 일 뿐이지 만 이상적인 솔루션을 찾지 못하는 것 같습니다.Silverlight 클라이언트를 WCF와 동기화하는 방법은 무엇입니까?

WCF를 사용하여 일부 서면 웹 서비스를 통해 타사 응용 프로그램을 제어하는 ​​Silverlight 클라이언트 응용 프로그램을 만들고 싶습니다. 둘 이상의 Silverlight 클라이언트가있는 경우 모든 클라이언트가 동기화되어야합니다. 즉, 한 클라이언트의 매개 변수 변경 사항을 모든 클라이언트에 전파해야합니다.

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

OnPropertyChanged를이 데이터 전송을 담당 :

나는 (클래스에서 INotifyPropertyChanged를 상속) 서버에 전달되는 매개 변수를 조작하는 매우 간단한 실버 라이트 GUI를 설정합니다. WCF 서비스 (duplex net.tcp)는 모든 클라이언트의 목록을 유지 관리하고 데이터 패킷 (매개 변수 변경 설명이있는 XElement)을 받자 마자이 바로 패킷을 패킷을 수신 한 클라이언트가 아닌 모든 클라이언트로 전달합니다.

클라이언트가 패키지를 받지만, 이제는 내부적으로 속성을 설정하는 가장 좋은 방법은 무엇인지 잘 모르겠습니다. "Height"(위 참조)를 사용하면 새로운 변경 메시지가 생성되어 다른 모든 클라이언트에게 전송됩니다.

아마도 데이터 필드 (frameworkElement.Height) 자체 또는 함수를 사용할 수 있습니다. 그러나 나중에 데이터 바인딩에 문제가 발생할지 여부는 확실하지 않습니다. 또한 중복 코드가있는 버그를 방지하기 위해 코드 속성의 일부만 복사하기를 원하지 않습니다.

그래서 무엇을 권하고 싶습니까?

감사합니다.

답변

1

한 가지 일반적인 해결책은 부울을 사용하여 OnPropertyChanged 내에서 현재 상태를 추적하는 것입니다. WCF 패킷이 수신되면 true로 설정할 수 있으며, 사실이라면 다시 브로드 캐스트하지 않습니다. 그런 다음 속성을 설정 한 후 false로 설정합니다.

속성을 정상적으로 설정하면 false로 남겨두기 만하면됩니다. 이로 인해 내부적으로 설정되면 정상적으로 브로드 캐스트되지만 WCF 호출을 통해 설정되는 경우에는 브로드 캐스트되지 않습니다.

이 옵션은 작동하지만주의를 기울여야합니다. 이 논리를 단일 지점에 넣으므로 올바른 정보를 얻는 것이 매우 쉽습니다.

+0

와우 - 정말 빠른 응답입니다. 감사합니다. 이 솔루션에 대해 생각해 봤지만 멀티 스레딩 문제가있을 수 있습니다. – JeffRSon

+0

@ user564226 : 일반적으로 Silverlight에서는 문제가 될 수 있습니다. 올바르게 동기화하려면주의를 기울여야하지만 한 번에 모두 처리되므로 대개 처리하기가 쉽습니다. –

+0

@ user564226 : 여기서 여러 스레드를 사용하는 경우 여러 스레드가 해당 속성을 동시에 설정하지 못하도록하려면 단일 잠금이 필요할 것입니다. –

관련 문제