7

ウィンドウのビューモデルを作成し、それをウィンドウにバインドする起動ダイアログボタンがあります(UI仮想化が有効になっています)。最初のクリックでダイアログを起動するのに 1 秒しかかかりません。しかし、同じダイアログを非常に頻繁に開いたり、続けて開いたりすると、次の繰り返しのためにグリッド データ ソースを設定するのにより多くの時間がかかり始めます。一時停止してから再度ウィンドウを開くと、約 1 ~ 2 秒しかかかりません。

for first time populating the item source it take only 1 second:
next time populating the item source it takes  2 second
next time populating the item source it takes  3 second
next time populating the item source it takes  6 second
next time populating the item source it takes  8 second

ただし、推奨されていない GC.Collect() を呼び出すと、グリッド データ ソースの入力には常に約 1 秒かかります。しかし、の呼び出し

Gc.Collect()
Gc.WaitForPendingFinalizer()
Gc.Collect()

繰り返しごとに時間がかかりました。

電話GC.Collectが良い選択肢ではないことはわかっています。アプリケーションのパフォーマンスを向上させる方法を誰か提案できますか?

私のマシンは非常に優れた構成になっているのに対し、ユーザーのマシンはそれほど高速ではない可能性があるため、ユーザーのマシンについてもっと心配しています。

4

1 に答える 1

3

コードを見ずに正確な問題を特定することは困難です。ただし、通常、これはいくつかの理由で発生する可能性があります。

  1. 常により多くのデータをロードします(2倍になる可能性がありますか?)。毎回 200 レコードのみをロードすることを示しました。ただし、再公開する前に、ロジックが正しく、以前のデータが消去されていることを確認してください。

  2. イベント サブスクリプションの登録を必ず解除してください。前のグリッド インスタンスに対して非表示のイベントがトリガーされる場合があります。偶数ハンドルにブレークを設定し、それが複数回トリガーされるかどうかを確認することで、簡単に確認できます。

  3. 作成しているすべての Disposable インスタンスを見て、適切に破棄しているかどうかを確認してください。おそらく、使い捨てインスタンスを破棄していないため、GC.Collect がヘルプを表示する理由になる可能性があります。

  4. ここでの仮想化の関与についてはよくわかりません。それが理由ではないことを確認するために、仮想化なしで同じテストを実行します。

于 2016-02-08T22:41:51.763 に答える