1

これはたぶん概念上の問題ですが、私は理想的な解決策を見つけることができません。SilverlightクライアントをWCFと同期させる方法は?

WCFを使用して、サードパーティのアプリケーションをいくつかの自己記述型Webサービスを介して制御するSilverlightクライアントアプリケーションを作成したいと考えています。複数のSilverlightクライアントがある場合は、すべてのクライアントを同期する必要があります。つまり、1つのクライアントからのパラメータ変更をすべてのクライアントに伝播する必要があります。

私は(クラスはINotifyPropertyChangedのを継承)サーバーに渡されたパラメータを操作する非常にシンプルなシルバーGUIを設定します。

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

OnPropertyChangedを、データを転送するための責任があります。 WCFサービス(duplex net.tcp)はすべてのクライアントのリストを保持し、データパケット(パラメータ変更の説明付きのXElement)を受信するとすぐに、この非常パケットをすべてのクライアントに転送します。

クライアントがパッケージを受信しましたが、今では内部的にプロパティを設定する最良の方法はわかりません。 "高さ"(上記参照)を使用すると、新しい変更メッセージが生成され、他のすべてのクライアントに送信されます。

データフィールド(frameworkElement.Height)自体または関数を使用することもできますが、後でデータバインドに問題が発生するかどうかはわかりません。また、冗長コードのバグを防ぐために、コードプロパティの一部を単純にコピーする必要はありません。

あなたは何をお勧めしますか?

ありがとうございます!

答えて

1

一般的な解決策の1つは、ブール値を使用してOnPropertyChanged内の現在の状態を追跡することです。 WCFパケットが受信されたときにtrueに設定することができます。それが本当であれば、再ブロードキャストしません。プロパティを設定した後、falseに設定します。

プロパティを通常設定するときは、falseのままにしておきます。これにより、内部で設定されていると正常にブロードキャストされますが、WCFコールでは設定されません。

このオプションは機能しますが、正しく動作するためには注意が必要です。このロジックを1つのポイントに入れているので、正しいものにするのはかなり簡単です。

+0

本当に速い応答、ありがとう!私はこの解決策について考えていましたが、マルチスレッドに問題があるのではないかと心配していました。 – JeffRSon

+0

@ user564226:一般的に、Silverlightでは問題はあるかもしれませんが、最小限です。正しく同期するように注意する必要がありますが、1つの方法ですべて処理されるため、通常は処理するのがかなり簡単です。 –

+0

@ user564226:ここで複数のスレッドを使用している場合、複数のスレッドが同時にそのプロパティを設定しないようにするには、おそらく単一のロックが必要です。 –

関連する問題