0

5 年前に開発を開始した金融アプリケーションがあります。これは、優れたユーザー インターフェイスを実現することを主な目的とする古いアプリケーションの移行です。当時の UI を考慮して、選択されたテクノロジは WPF です。アプリケーションは引き続き .Net バージョン 3.5 SP1 を使用します。現在のアプリケーションは階層化されていますが、ビジネス ロジックとバックエンドは別のテクノロジであり、問​​題の範囲外です。クライアントは従来の MVVM アプリケーションではありませんが、そこからいくつかの概念が混在しています。

単純なシナリオでは、データは型指定されたデータセットの形式でアプリケーション サーバーから取得されます。クライアントへのデータセットは、INotifyPropertyChanged インターフェイスを実装するデータ オブジェクト (POCO) にマップされ、プロパティは PropertyChanged イベントを発生させます。これらのデータ オブジェクトは実質的に UI にバインドされ、ユーザー インタラクションへの応答としてルーティングされたコマンドが実行され、最終的にデータがサーバーから取得されます。Active Record パターンのバリエーションが実装されているため、基本的に、サーバーから受信したデータセットの各テーブルはデータ オブジェクトにマップされ、データ オブジェクトのプロパティはテーブルの列を表し、データ オブジェクト インスタンスはテーブルの行を表します。WPF バインディングが使用されるため、取得されたデータは自動的に UI に表示されます。

問題は、パフォーマンスの問題が発生し始めたことです。データがサーバーから取得された後、非決定的な方法で表示されることがあります。データセットからのマッピングが開始されてから UI が更新されるまでの間に遅延があります。低速のマシンでは、この遅延は最大で数秒になることがあります。強力なマシンでは、遅延は重要ではないようです。また、遅延は一定ではないため、同じデータを取得すると、UI が数ミリ秒で更新されることもあれば、数秒続くこともあります。

問題を切り分けたと思います。それは、バインディング ソース (データ オブジェクト) に多くのプロパティ (例: 50) があり、UI にバインディングを使用する多くのコントロール (テキスト ボックス) が含まれている場合のバインディングの使用です。いくつかの測定は、異なるツールを使用して行われました。メモリリークはないようです。バインディングに参加しているデータ オブジェクトのプロパティが更新される瞬間に、処理の遅延が見られました。また、プロパティの値を設定する期間は、値自体にも依存するようです (例: バインディングでコンバーターを使用するかどうかに関係なく、10 進数のプロパティをゼロ値で更新する方が高速です。コンバーターと文字列を使用せずにテストを行った場合、プロパティ値文字列「0」は、プロパティ値「123.456.00」よりもはるかに高速に更新されます)。

基本的に、パフォーマンスの問題の大部分は、多くのプロパティ (例: 50) を持つオブジェクトにバインドされた UI 上の多くのコントロール (例: 150 個のテキストボックス) を使用していると考えられます。バージョン 3.5 をターゲットにするのは、バージョン 4.0 または 4.5 をターゲットにするよりもはるかに遅いことに気付きました。遅延は再現できますが、常に発生しているわけではありません。遅延は、5 ミリ秒から 2 秒まで、または非常に遅いマシンでは数十秒まで、指数関数的に増減します。

パフォーマンスの問題 (UI が更新されるまでの遅延) は、WPF テクノロジとバインディング メカニズムに関連していると思われますが、確認されていません。

したがって、基本的に、遅延が発生する理由、なぜ遅延が発生するのか (非決定論的)、WPF バインディング システムが原因なのかはわかりません。

これに関する助けをいただければ幸いです。ありがとうございました。

4

0 に答える 0