0

Silverlight 5 と MVVM Light を使用して、Silverlight アプリケーションに取り組んでいます。ビューには 3000 を超えるグラフィック要素がレンダリングされており、それぞれに ViewModel が関連付けられています。これらのオブジェクトをこれらのビュー モデルにバインドするには、ItemsControl を使用します。ビューが初めてロードされるとき、3000 個のオブジェクトをレンダリングするのに 7 秒かかります。ただし、新しいビュー モデル コレクションを設定してビューを更新すると、レンダリングに 17 秒かかります。今回レンダリングする ViewModel の数を減らしたとしてもです。ここで懸念されるのは、異なるレンダリング間の 10 秒の違いです。

ViewModel が GC によってクリーンアップされないように (別のコレクションに追加し、解放しないことで)、その後のレンダリング時間もすべてわずか 7 秒であることがわかりました。したがって、ここからの結論は、余分な 10 秒は古い ViewModel のガベージ コレクションが原因であるということです。

上記の内容から、ガベージ コレクションが UI スレッドをブロックしているように見えます。UI は、GC がそのジョブを完了するまで凍結されます (これは、VM ファイナライザー メソッドでの一時的なログ記録が完了すると見なされます)。その後、UI はレンダリングを再開します。

要約すると、タイミングは次のとおりです。

最初の 3000 オブジェクト – ~7 秒。次に 500 個のオブジェクトに置き換えます – 約 17 秒。

最初の 500 オブジェクト – ~2 秒。次に 3000 個のオブジェクトに置き換えます – 約 7 秒。

最初の 3000 オブジェクト – ~7 秒。次に 3000 個のオブジェクトに置き換えます – 約 17 秒。

私たちが目にしているこの非常に奇妙な問題について何か提案はありますか?

4

1 に答える 1

0

場合によっては、ガベージコレクターを手動で呼び出す必要があります。影響はないかもしれませんが、コードを調査し、コードのどこかにうまく収まるかどうかを確認して、読み込み時間に影響があるかどうかを確認することをお勧めします。

GCを手動で呼び出すには、このリンクを確認してください。

于 2012-06-25T01:44:24.493 に答える