1

Dies ist wahrscheinlich nur ein konzeptionelles Problem, aber ich kann nicht die ideale Lösung finden.Wie können Silverlight-Clients mit WCF synchronisiert werden?

Ich möchte eine Silverlight-Clientanwendung erstellen, die WCF verwendet, um eine Anwendung von Drittanbietern über einen selbst geschriebenen Webservice zu steuern. Wenn es mehr als einen Silverlight-Client gibt, sollten alle Clients synchronisiert werden, d. H. Parameteränderungen von einem Client sollten an alle Clients weitergegeben werden.

stellte ich einen sehr einfachen Silverlight-GUI, die Parameter manipuliert, die an den Server übergeben werden (Klasse erbt INotifyPropertyChanged):

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

OnPropertyChanged zum Übertragen von Daten verantwortlich ist. Der WCF-Dienst (duplex net.tcp) führt eine Liste aller Clients, und sobald er ein Datenpaket (XElement mit Beschreibung der Parameteränderung) empfängt, leitet er dieses Paket an alle Clients weiter, aber an denjenigen, von dem das Paket empfangen wurde.

Der Client empfängt das Paket, aber jetzt bin ich mir nicht sicher, was die beste Möglichkeit ist, die Eigenschaft intern festzulegen. Wenn ich "Höhe" (siehe oben) verwende, würde eine neue Änderungsnachricht erzeugt und an alle anderen Clients gesendet werden a.s.o.

Vielleicht könnte ich das Datenfeld (frameworkElement.Height) selbst oder eine Funktion verwenden - aber ich bin mir nicht sicher, ob es später Probleme mit der Datenbindung geben würde. Außerdem möchte ich nicht einfach Teile der Codeeigenschaften kopieren, um Bugs mit redundantem Code zu vermeiden.

Was würden Sie also empfehlen?

Danke!

Antwort

1

Eine gängige Lösung besteht darin, einen Boolean zu verwenden, um den aktuellen Status in OnPropertyChanged zu verfolgen. Es kann auf true gesetzt werden, wenn ein WCF-Paket empfangen wird, und wenn es wahr ist, wird nicht erneut gesendet. Sie legen dann nach dem Festlegen der Eigenschaft den Wert false fest.

Wenn Sie die Eigenschaft normal festlegen, lassen Sie sie einfach falsch. Dies führt dazu, dass es normal sendet, wenn es intern festgelegt wird, aber nicht, wenn es über den WCF-Aufruf festgelegt wird.

Diese Option funktioniert, aber es erfordert Sorgfalt, um richtig zu machen. Da Sie diese Logik in einen einzigen Punkt einfügen, sollte es ziemlich einfach sein, richtig zu werden.

+0

Whow - sehr schnelle Antwort, danke! Ich hatte über diese Lösung nachgedacht, aber ich hatte Angst, dass es Probleme mit Multithreading geben könnte. – JeffRSon

+0

@ user564226: Es kann Probleme geben - obwohl es in Silverlight im Allgemeinen minimal ist. Sie müssen darauf achten, dass die Synchronisation korrekt ist, aber da es alles in einer einzigen Methode behandelt wird, ist es normalerweise ziemlich einfach zu handhaben. –

+0

@ user564226: Es wird wahrscheinlich eine einzige Sperre erfordern, um zu verhindern, dass mehrere Threads diese Eigenschaft gleichzeitig setzen, wenn Sie hier mehrere Threads verwenden. –

Verwandte Themen