1

大量のメモリを使用しているアプリケーションがありますが、今のところ、この事実を変更することはできません。私の問題は、実行したい操作があり、進行状況ダイアログを表示することですが、xaml進行状況ウィンドウを表示するGC.Collectと10回呼び出されるようです!進行状況ウィンドウを開くのを最適化する方法はありますか?

私のAntsProfilerによると、GC.Collectに至るまでの呼び出しは

System.Window.ShowDialog() ->
..
..
System.Windows.Media.Imaging.BitmapSource.CreateCachedBitmap ->
SafeMILHandle.UpdateEstimatedSize ->
SafeMILHandleMemoryPressure.ctor ->
MemoryPressure.Add ->
MemoryPressure.ProcessAdd ->
GC.Collect
4

4 に答える 4

2

ビットマップイメージに関連するメモリプレッシャーとその後のガベージコレクションを完全に無効にするソリューションもあります。これはハックのようなものですが、同様の問題についてはここで読むことができます。

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

これにより、コード全体を検索してWPFアイコンの初期化を見つけて変更する必要がなくなります。その上、のようないくつかのコントロールは、System.Windows.Forms.Integration.ElementHost初期化の方法に関係なく、ビットマップ関連のメモリプレッシャーを暗黙的に追加します。

于 2015-10-16T18:43:40.973 に答える
1

トピックに関連する他のstackoverflowの質問を確認しましたか?使用できるヒントがあるかもしれません:

リアルタイムの.NETアプリケーションでガベージコレクションを回避するにはどうすればよいですか?

于 2013-01-29T20:46:45.117 に答える
1

これはWPFのバグ/機能です。

https://connect.microsoft.com/VisualStudio/feedback/details/687605/gc-is-forced-when-working-with-small-writeablebitmap

http://referencesource.microsoft.com/#PresentationCore/Core/CSharp/MS/Internal/MemoryPressure.cs

編集:.NET 4.6.2以降、MemoryPressureクラスは削除されました。

于 2015-09-02T12:51:46.683 に答える
0

ガベージコレクションは、WPFアイコンの初期化が原因で発生しました。xamlからiconプロパティを削除したとき:

<Window ... Icon="/CommonUI;component/Common/ProgressReporting/MyIcon.ico">

代わりに、コンストラクターで初期化しました。

public ProgressWindow()
        {
            InitializeComponent();
            Icon = Properties.Resources.MyIcon.ToImageSource();
        }

問題は解決しました。

System.Window.UpdateIcon()の間に呼び出されなくなった違いShowDialog()。呼び出しは、アイコンファイル内の画像サイズごとUpdateIcon()にを作成していました。アイコンファイルは、呼び出しを行っていました。アプリケーションのメモリ使用量が多いため、作成された新しいビットマップごとに呼び出しが行われました。CachedBitmapMemoryPressure.AddGC.Collect

この小さな変更により、大きなプロジェクトがアプリケーションに読み込まれるときに、進行状況ダイアログの読み込み時間が15秒短縮されました。

于 2013-01-30T13:40:08.933 に答える