WP7 утечка памяти? - Переход между страницами, содержащими сводные элементы с привязкой к списку - PullRequest
1 голос
/ 28 января 2011

У меня есть главная страница, где у меня есть 3 сводных элемента, и в каждом из них есть ListBox, который тяжелый (около 15 МБ каждый, это нормально?) Когда происходит какое-то действие, я перехожу на другую страницу, где у меня есть другой элемент управления Pivot с 3 элементами. Пока все хорошо. Когда я возвращаюсь на главную страницу, я вижу разницу в используемой памяти от +2 до + 4Мб. И каждый раз, когда я перехожу на новую страницу и затем возвращаюсь на главную страницу, к общей используемой памяти добавляются еще 2-4 МБ. Я уверен, что в моем коде нет ничего плохого. Даже если бы в моем коде была утечка памяти, она не была бы такой большой. Это, вероятно, связано с некоторыми элементами пользовательского интерфейса, которые не выпущены? Я вручную вызываю сборщик мусора onNavigatedFrom и onNavigatedTo на обеих страницах jsut на всякий случай, но все равно.

Может ли это быть утечка памяти в каком-то элементе управления? Как я уже говорил, обе страницы содержат сводные элементы со списками со связыванием данных, и данные не изменяются во время выполнения.

спасибо

Ответы [ 3 ]

3 голосов
/ 01 апреля 2011

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

Даже если ваш код чистый, ваша страница может утечь, если вы используете элемент управления от внешней стороны, у которой есть утечка.В этом случае вы можете смягчить воздействие, удалив нарушающий элемент из вашего дерева в OnNavigatingFrom ().Таким образом, просачивается только тот элемент управления, а не вся страница.

В настоящее время Ad Control попадает в эту категорию.Вот руководство для этого: http://msdn.microsoft.com/en-us/library/gg491975(v=msads.10).aspx

Аналогичная история для ContextMenu из SL Toolkit, если вы используете это.

2 голосов
/ 11 апреля 2012

Обсуждение на http://forums.create.msdn.com/forums/p/76007/466968.aspx было очень полезно для моих приложений.

То, что я делал и работал (ссылка сверху):

  • Объявление деструкторов для всех страниц (только отладка)
#if DEBUG
        ~MyPageView()
        {
            System.Windows.Deployment.Current.Dispatcher.BeginInvoke(new System.Action(() =>
            {
                System.Windows.MessageBox.Show("MyPageView Destructing");
                // Seeing this message box assures that this page is being cleaned up
            }));
        }
#endif
  • Добавить следующий файл в App.xaml в методе CompleteInitializePhoneApplication
        private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e)
        {
#if DEBUG
            System.GC.Collect();
            System.GC.WaitForPendingFinalizers();
#endif
            // Other usual stuff in this method
        }
  • Очистить все DataContext при переходе со страницы
protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
    base.OnNavigatedFrom(e);

    // Clear the page datacontext
    this.DataContext = null;
    // Clear any other datacontexts esp if the life time of the databound objects are different.
    MyDownloadProgressBar.DataContext = null;
    // Make sure that if there are any references to elements scoped to this page's lifetime are being held by any other global objects, then they should be cleared here
}

Поскольку я найду больше способов / советов по управлению памятью в своих приложениях, я буду обновлять этот ответ.

0 голосов
/ 11 ноября 2013

Извините, мой английский очень плохой.Тем не мение.У меня такая же проблема.Я решил так:

protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
    {
        base.OnBackKeyPress(e);
        timer.Tick -= timer_Tick;
        this.Loaded -= new RoutedEventHandler(timer_Tick);
        AnaMenu.cli.GetAboutCompleted -= client_GetAboutCompleted;
    }

Я использовал -= для событий.И исправил это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...