3

問題は非常に単純です。基本的に、私のビューは WCF サービスからのデータを表示する必要があります。データは高頻度で非同期に更新されるため、サーバー側のデータが変更された場合はそれに応じて GUI を更新する必要があります。

View は大量のデータを表示しているため、基本的には ViewModel で公開されている 50/60 フィールドをバインドしています。

モデル パーツは基本的に、GUI に表示される 50/60 フィールドを含む POCO オブジェクトです。はい、ViewModel は Model オブジェクトを View に公開しています。(プロパティ値が変更されたときにビューに通知するために、Model オブジェクトは INotifyPropertyChanged を実装することに注意してください。)

ここで、WCF サービスとやり取りする "DataService" レイヤーを作成しました。これは、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...
  }
}

サーバー側で変更されていないモデルのフィールドのみを更新したいので、モデルを更新するこの恐ろしいコードが必要です。(wcf サービス API は変更できないことに注意してください)。

私の質問は、「OnServiceUpdated」ハンドラーのパフォーマンスを向上させるために何を提案しますか?

前もって感謝します、ジョン

4

1 に答える 1

2

あなたは「データは高頻度で非同期的に更新されます」と言います

私が理解しているように、UIに頻繁に影響を与えることは望ましくありません。したがって、遅延通知にはディスパッチャタイマーを使用できます。UIスレッドで動作し、他のタイマーとは異なります。

http://msdn.microsoft.com/tr-tr/library/system.windows.threading.dispatchertimer.aspxこれは、SOユーザーhttps://stackoverflow.com/a/15044392/413032 の回答です。

MVVMを使用している場合は、args.ChangedFieldsの名前とViewModelプロパティの名前を同じにします。したがって、リフレクションまたは自動マッパーを使用して、プロパティ値をviewModelプロパティに転送できます。

すべてのプロパティを設定した後、イベントを発生させてUIを更新することもできます。

これを提供するため;

私が理解しているように、バインディングを使用しているので、バインディングにはモードとupdatesourcetriggerオプションがあり、明示的にupdatesouceを実行できます。

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

道を教えてください。

于 2013-03-05T06:18:23.150 に答える