Vazamento de memória wpf estranho
Estou tendo um problema estranho com um vazamento de memória através de um MenuItem no wpf.
Eu posso observar esse vazamento de memória no profiler de memória .net.
Nosso aplicativo possui a seguinte arquitetura:
Uma MainWindow, na qual os modelos de dados são um ApplicationPresenter. O ApplicationPresenter dura toda a vida útil do aplicativo. ApplicationPresenter tem um MainPresenter que representa essencialmente um arquivo e seu conteúdo. Quando um arquivo (Solution) é carregado, um novo apresentador principal é criado e o antigo é descartado.
O modelo de dados para o apresentador do aplicativo é semelhante ao seguinte:
<DataTemplate DataType="{x:Type ApplicationPresenter}">
<ContentPresenter Content="{Binding Presenter}"/>
</DataTemplate>
O MainPresenter possui várias abas, mas basicamente seu modelo de dados é um grande Menu dentro de um DockPanel. O menu tem alguns elementos aninhados, por exemplo, Arquivo, Editar, Ver ... na parte superior e dentro de Arquivo, você tem Novo, Abrir ... e, em seguida, submenus, como Importar, que tem uma carga de itens.
Todos esses apresentadores implementam o INotifyPropertyChanged e temos uma implementação do ICommand que contorna a loucura associada a ele (em geral os comandos não vazam no aplicativo).
No entanto, o que eu vejo é que ao abrir uma nova solução (ou qualquer outra operação que crie um novo MainPresenter) é que o MainPresenter original (o primeiro que é criado quando o aplicativo é carregado) fica pendurado na memória através do campo _submenuPopup de MenuItem! Anexei a imagem do criador de perfil para ajudar a mostrar o que quero dizer:
O número de instâncias não passa dos dois ao fazer mais operações e é sempre o primeiro apresentador que está na memória. Todos os menus funcionam (incluindo os itens nos submenus)
Alguém está familiarizado com este problema e sabe de uma maneira de resolvê-lo?
Não é extremamente crítico como apenas uma solução, o que significa que não levará a uma OutOfMemoryException. No entanto, pode ser muito caro, pois o programa pode ser aberto clicando duas vezes em arquivos (o que significa que o primeiro apresentador pode manter uma grande quantidade de dados), potencialmente dobrando o uso de memória desnecessariamente.