2017-01-26 2 views
1

Я разработал приложение UWP, которое использует MvvmLight, но есть утечки памяти. Мое приложение содержит 2 основных страниц:UWP: как правильно очистить ViewModel?

  • на главную страницу, содержащий перечень форм
  • Детали страниц, содержащий все сведения о выбранной форме (Данные, фотографии, ...)

Каждый раз, когда я открываю Подробности страницу, я могу видеть, что более 25 Mo используются памяти: так что после десятка страниц нагрузок , Приложение становится медленнее ...

Мои ViewModels наследуют от ViewModelBase, так что я могу использовать Cleanup().

Так что я пытаюсь использовать его в DetailsViewModel так:

public override void Cleanup() 
{ 
    Messenger.Default.Unregister<SendImageOnDetailsViewModel>(this); 
    Messenger.Default.Unregister<SendDeletedImageOnDetailsViewModel>(this); 
    VComponentBoms = null; 
    VComponentOrders = null; 
    VCoreOrders = null; 
    CarForm = null; 
    base.Cleanup(); 
} 

Я называю это непосредственно на DetailsViewModel, после того, как пользователь сохранил форму, прежде чем он вернется к HomeViewModel :

Cleanup(); 
NavigationService.NavigateTo<HomeViewModel>(this, new object[] { }, "RefreshForms", new object[] { }, false); 

Я также называю его, когда пользователь возвращается на главную страницу через кнопку Назад через AppBackButtonPressed() в App.xaml.cs:

if (cur.GetType() == typeof(DetailsViewModel)) 
{ 
    cur.Cleanup(); 
    GC.Collect(); 
} 

Это работает без ошибок, но это не кажется, хороший способ реализовать ...

На некоторых образцах, Очистка() является повышением на Закрытие события страницы, которой нет на UWP.

Так есть ли более чистый способ сделать это с помощью UWP?

+0

Как кэшировать страницу (NavigationCacheMode)? Btw вы не должны использовать GC.Collect() ... –

ответ

1

Без полной информации о том, что вы делаете, трудно быть уверенным, но похоже, что проблема заключается не в очистке ViewModels, а в страницах, используемых для их отображения. Если вы продолжаете навигацию вперед, у вас будет несколько страниц, каждая из которых использует память. (Инструменты профилирования памяти покажут вам, где используется память, и вы должны использовать их для проверки фактической проблемы.)

Предполагая, что проблема заключается в создании нескольких страниц, после просмотра страницы с подробной информацией вы должны вернуться назад на главную страницу, а не на нее.
Если вы перейдете вперед, будет создана другая копия главной страницы, и это дублирование страницы и содержимого станет причиной утечки. Если вы вернетесь, страница, которую вы оставили, может быть собрана. Обратите внимание, что это не обязательно будет сделано немедленно.

Если у вас по-прежнему возникает проблема с утечкой памяти, когда вы переходите с страницы с подробной информацией на главную страницу, тогда проблема будет на странице сведений, которая предотвращает сбор памяти. Более подробная информация (и, в идеале, репродукция) потребуется для определения причины.

Смежные вопросы