2

wpf の MenuItem によるメモリ リークという奇妙な問題が発生しています。

このメモリ リークは、.net メモリ プロファイラーで確認できます。

アプリケーションのアーキテクチャは次のとおりです。

ApplicationPresenter をデータ テンプレート化する MainWindow。ApplicationPresenter は、アプリケーションの存続期間全体にわたって持続します。ApplicationPresenter には、基本的にファイルとその内容を表す MainPresenter があります。ファイル (ソリューション) が読み込まれると、新しいメイン プレゼンターが作成され、古いプレゼンターは破棄されます。

アプリケーション プレゼンターのデータ テンプレートは次のようになります。

    <DataTemplate DataType="{x:Type ApplicationPresenter}">
        <ContentPresenter Content="{Binding Presenter}"/>
    </DataTemplate>

MainPresenter には多くのタブがありますが、基本的にそのデータ テンプレートは DockPanel 内の大きなメニューです。メニューには、ファイル、編集、表示などのネストされた要素がいくつかあり、ファイル内には、新規、開く、そしてインポートなどのサブメニューがあり、アイテム自体がロードされます。

これらのプレゼンターはすべて INotifyPropertyChanged を実装しており、それに関連するクレイジーさを回避する ICommand の実装があります (一般に、コマンドはアプリケーションでリークしません)。

ただし、新しいソリューション (または新しい MainPresenter を作成するその他の操作) を開くと、元の MainPresenter (アプリケーションの読み込み時に最初に作成されるもの) が、MenuItem の _submenuPopup フィールドを通じてメモリ内にぶら下がっていることがわかります。私が何を意味するかを示すのに役立つように、プロファイラーからの写真を添付し​​ました。

リークのグラフ

さらに操作を行ってもインスタンスの数が 2 を超えることはなく、メモリ内にあるのは常に最初のプレゼンターです。メニューはすべて機能します (サブメニューの項目を含む)

誰もこの問題に精通しており、それを解決する方法を知っていますか?

OutOfMemoryException が発生しないことを意味する 1 つのソリューションのみであるため、それほど重要ではありません。ただし、ファイルをダブルクリックしてプログラムを開くことができるため (最初のプレゼンターが大量のデータを保持できることを意味します)、メモリ使用量が不必要に 2 倍になる可能性があるため、非常にコストがかかる可能性があります。

4

0 に答える 0