Подтвердить что ты не робот

Удаление проекта/страниц/пользовательских элементов из памяти

Я сделал приложение для Windows-телефона, у которого, к сожалению, есть утечка памяти, потому что страницы не удалены правильно. Это было решено с помощью ответа:

Удалить страницы Windows-телефона Заявив:

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
while (App.RootFrame.RemoveBackEntry() != null) ; //line if you navigate without backkey
base.OnNavigatedTo(e);

this.Dispatcher.BeginInvoke(() =>
{
    GC.Collect();
    GC.WaitForPendingFinalizers();

    this.Dispatcher.BeginInvoke(() =>
    {
        GC.Collect();
        GC.WaitForPendingFinalizers();

        this.Dispatcher.BeginInvoke(() =>
        {
            GC.Collect();
            GC.WaitForPendingFinalizers();
        });
    });

}

Это удалило ссылки на страницы из профилировщика. Но память по-прежнему увеличивалась при навигации. И не было очевидным, откуда появилась увеличенная память. Поэтому я попытался ввести пустой проект и перешел к нему в качестве звездной навигации, Иллюстрированный как:

enter image description here

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

  • WebService
  • MainProject
  • SecondaryProject
  • PortableLibrary

Я разделяю модели между всеми проектами, используя портативную библиотеку. Это повлияло на то, что при каждой навигации к новому проекту все очищается в старом проекте, т.е. Существует только один элемент каждого элемента, значительное улучшение памяти. Но все же какая-то утечка памяти, хотя и ограниченная, что означает лишь некоторое увеличение памяти. Но откуда приходит память? Возвращаясь к профилировщику:

enter image description here

Это показывает, что страницы не удаляются конкретно, все элементы .view. был бы удален кодом в конфигурации всех страниц, находящихся в одном проекте. Однако утечка памяти аналогична.

Вопрос

  • Как удалить страницы и элементы из другого проекта внутри такое же решение?
  • Как удалить проект из памяти?

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

Надеюсь, кто-то может помочь. спасибо!

Дополнительные тесты

Я пробовал делать все пользовательские настройки страниц, чтобы избежать навигации. Но воссоздавая их пару раз, была устойчивая утечка 1-2 Мб. Идея проекта, следовательно, по-прежнему лучше, так как существует привязка. Но до сих пор нет решения по его устранению.

Все еще надеется на рыцаря с сияющей клавиатурой;)

4b9b3361

Ответ 1

Я думаю, вы можете сделать объект singleton, и вы можете вручную очистить значения объектов вручную. Пожалуйста, перейдите по ссылке ниже https://msdn.microsoft.com/en-us/library/ff650316.aspx

Ответ 2

Найдите все одноразовые графики/ввода-вывода, убедитесь, что их разместили (после того, как вы закончили их использовать).
Все такие объекты наследуются от интерфейса IDispose.

Ответ 3

Остерегайтесь сторонних элементов управления/библиотек, Image, LongListSelector, FlipView или WebView, потому что у них есть некоторые проблемы с управлением памятью.

Вы должны убедиться, что нити/задачи/таймеры не ссылаются на ваши представления /ViewModels.

Есть две интересные статьи об утечках памяти:

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