9

問題:

別の WPF ウィンドウを開くことができる Winforms アプリケーションがあります。このウィンドウにはさまざまなアイコンとテキストが含まれており、過度に複雑ではありません。メイン ウィンドウの winforms に戻ります。これには、ElementHost を使用して埋め込まれた WPF コントロールもあります (ElementHost は、Winforms が WPF コントロールをホストできるようにするために特別に設計されています)。ただし、このアプリケーションのメモリ使用量が非常に高くなると、この 2 番目の WPF ウィンドウを開くのにかなりの時間がかかる可能性があることに気付きました。

問題を再現できるVS2012で小さなテストアプリケーションを作成しました。テスト アプリケーションは、2 つのボタンを持つ Winforms ウィンドウを開きます。「4GBのメモリ使用量を追加」と「WPFウィンドウを開く」。WPF ウィンドウには 1 つの小さなアイコン (48*48) があり、それだけです。4Gb のメモリ使用量を追加して初めてウィンドウを開こうとすると、ウィンドウを開くのに約 7 秒かかります。

コード: BitBucketを通じてテスト アプリとソース コードを公開しました。

私たちが発見したこと:

  • 32 ビットでは OutOfMemoryExceptions がスローされるため、アプリは間違いなく 64 ビットで実行されています。
  • メモリ使用量がなければ、ウィンドウはすぐに開きます。
  • メモリ使用量により、ウィンドウは最初に開いたときだけ遅くなります。
  • WPF ウィンドウに画像がない場合は、すぐに開きます。
  • winforms コントロールにある elementhost のサイズを 1*1 に縮小すると、ウィンドウがすぐに開きます。このサイズでは WPF コントロールの多くが表示されないため、明らかにこれは優れたソリューションではありません。
  • アプリケーションの ElementHost のサイズは約 1000*700 ですが、ElementHost のサイズを縮小すると大きな低下点があることに気付きました。そのため、約 350*350 になるまでこの 10 秒かかります。再び速くなるように改善します。これは、コンピューターに依存するか、何らかの制限がある可能性があります。
  • wpf ウィンドウから画像を削除すると、再び高速になります。
  • 新しい画像をリソースとして WPF ウィンドウに追加すると、開く時間が直線的に遅くなります (たとえば、画像 1 つ = 7 秒、画像 2 つ = 14 秒)。
  • 画像が表示されているのと同じサイズであることを確認して実験したので、サイズ変更はありませんが、これは何の違いもないようです。
  • さまざまな画像タイプ、.png、.tiff、.ico を試してみましたが、どれも遅いようでした。

他の誰かがこの問題を経験しましたか / 次のステップについて何か提案はありますか?

4

1 に答える 1

4

プロファイラーを使用してさらに分析した結果、この記事は私が経験していた問題と同じように見えました。

typeof(BitmapImage).Assembly.GetType("MS.Internal.MemoryPressure")
.GetField("_totalMemory", BindingFlags.NonPublic | BindingFlags.Static)
.SetValue(null, Int64.MinValue / 2); 

最も良い解決策ではありませんが、問題は間違いなく修正されました。

于 2014-04-07T23:50:12.190 に答える