4

C# プロジェクトで winrt コントロール (検索結果コントロール) の数百のインスタンスを作成できるようにしたいと考えています。問題は、これを行うには時間がかかりすぎ (10 分の 1 秒以下)、UI スレッドで実行する必要があるため、結果の表示に失速や遅延が生じることです。

今のところ、起動時にコントロールの多くのインスタンスを事前にキャッシュすることで、この問題を回避しました。このアプローチは機能しますが、起動時間に影響し (プロファイリングでは、起動近くのプロセッサ時間の 40% がこれらのコントロールのキャッシュに費やされていることが示されています)、キャッシュのサイズなど、管理すべき詳細が作成されます。

問題は、コントロールがインスタンス化されるたびに、XAML の再解析などの冗長な作業が基礎となるフレームワークによって行われることだと思います。この作業を繰り返さないようにする方法はないでしょうか?たぶん、既存のコントロールを安価に複製できますか? 誰にもアイデアはありますか?

4

2 に答える 2

1
  • 並列スレッドで事前キャッシュを行うことができます。マルチコア プロセッサの起動時間への影響が少ない

  • searchresult.memberwiseclone は浅いコピーを提供します。それはより速いかもしれません、確かではありません

  • 検索結果を 1 つだけ使用して、使用する直前に適切なデータを入力していただけますか? その場合、たくさん作る必要はありません。再利用可能な容器として1つだけ使用してください。

  • コントロールを親フォームに追加するときに時間がかかる場合は、使用できます

    • suspendlayout/resumelayout (これは win32 です)
    • 親を非表示に設定し、完了したら表示に戻します
  • 同じことをより速く行う別の方法はありますか?(競合するコントロール、サードパーティなど)

于 2012-08-20T11:55:38.733 に答える
1

前もって: しばらく経っているため、Microsoft は今までに win8 アプリの UI 仮想化を修正している可能性があります。私はチェックしていません。

当時私が最終的に行ったことは、問題を回避するために独自の UI 仮想化をハッキングすることでした。基本的には、コントロールをキャッシュし、それらを再利用して表示可能なデータを表示します (バイナリ検索ツリーを使用して、表示可能なデータを効率的にクエリします)。私はそれについてブログ記事を書きました。

于 2013-12-18T18:06:02.230 に答える