奇怪的wpf内存泄漏

时间:2013-06-21 15:51:05

标签: c# wpf memory-leaks

通过wpf中的MenuItem,我遇到了内存泄漏的奇怪问题。

我可以在.net内存分析器中观察到这个内存泄漏。

我们的应用程序具有以下架构:

MainWindow,其中数据模板是ApplicationPresenter。 ApplicationPresenter可以持续应用程序的整个生命周期。 ApplicationPresenter有一个MainPresenter,它实质上代表一个文件及其内容。当加载文件(解决方案)时,将创建一个新的主演示者,并丢弃旧的主演示者。

应用程序演示者的数据模板如下所示:

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

MainPresenter有许多选项卡,但基本上它的数据模板是DockPanel内的一个大菜单。菜单中有一些嵌套元素,例如文件,编辑,查看...在顶部和文件中你有新的,打开...然后子菜单,如导入,然后有一个项目本身。

所有这些演示者都实现了INotifyPropertyChanged,我们有一个ICommand的实现,可以解决与之相关的疯狂问题(通常命令不会在应用程序中泄漏)。

然而,我看到的是,当打开一个新的解决方案(或任何其他创建新的MainPresenter的操作)时,原始的MainPresenter(在应用程序加载时创建的第一个)通过字段_submenuPopup在内存中挂起MenuItem!我附上了探查器的图片,以帮助表明我的意思:

graph of leak

执行更多操作时实例的数量不超过两个,并且它始终是内存中的第一个Presenter。菜单都有效(包括子菜单中的项目)

是否有人熟悉此问题并知道解决问题的方法?

它没有大规模的批评,因为只有一个解决方案意味着它不会导致OutOfMemoryException。但是它可能非常昂贵,因为可以通过双击文件打开程序(意味着第一个演示者可以保留大量数据),可能会使内存使用量不必要地加倍。

0 个答案:

没有答案