Zrobiłem aplikację na telefon z systemem Windows, która niestety ma wyciek pamięci, ponieważ strony nie są usuwane poprawnie. To zostało rozwiązane za pomocą odpowiedź:Usuwanie projektu/stron/elementów sterujących użytkownika z pamięci
Remove Pages windows phone Stwierdzenie:
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();
});
});
}
ten usunięto odniesienia stronę od Profiler. Ale pamięć wciąż wzrastała podczas nawigacji. I nie było oczywiste, skąd pochodzi zwiększona pamięć. Dlatego Próbowałem wprowadzenie pusty projekt i poruszać się, że jako nawigacji gwiazdkowym Illustrated jako:
To sprawiło usunięte w górę o 20 MB, z wizualizacjami i innych elementów. To był duży krok. Dlatego chciałem podzielić funkcjonalność na różne projekty, aby usunąć wszelkie powiązania między różnymi funkcjami i utrzymać niskie zużycie pamięci. To skończyło się następującą strukturą:
- WebService
- MainProject
- SecondaryProject
- PortableLibrary
dzielę modeli pomiędzy wszystkimi projektami z wykorzystaniem przenośnego Library. To wpłynęło na to, że po każdej nawigacji do nowego projektu wszystko jest wyczyszczone w starym projekcie, tj. Istnieje tylko jeden element każdego elementu, znaczna poprawa pamięci. Ale wciąż jakiś wyciek pamięci, jakkolwiek ograniczony, oznaczający tylko pewien wzrost pamięci. Ale skąd pochodzi wspomnienie? Wracając do profilera:
To pokazuje, że strony nie są usuwane konkretnie, wszystkie elementy .view. zostałby usunięty przez kod w konfiguracji wszystkich stron będących w jednym projekcie. Jednak przeciek pamięci jest podobny.
Pytanie
- Jak mogę usunąć strony i elementy z innego projektu w ciągu samo rozwiązanie?
- Jak usunąć projekt z pamięci?
Nie ma informacji udostępnionych między dwoma projektami, z wyjątkiem tych, które mogą utworzyć wersję LibraryOfModels
. Dlatego nie ma żadnych wydarzeń, zmiennych ani odniesień w granicach projektu. Ale za moje życie nie mogę usunąć tego z pamięci. Chcę je usunąć z pamięci, tak jak mój fragment kodu u góry, JEŚLI nawigacja była tylko w ramach jednego projektu. Problem istnieje, ponieważ nawigacja jest rozłożona na dwa projekty. Ale ma pewne zalety pamięci w innych obszarach, dlatego chcę tej struktury.
Mam nadzieję, że ktoś może pomóc. Thx!
Dodatkowe testy
Próbowałem czyniąc wszystkie strony UserControls takie, że mogę uniknąć nawigację. Ale odtwarzając je kilka razy gav stały wyciek 1-2 Mb. Idea projektu jest zatem najlepsza, ponieważ istnieje granica. Ale wciąż nie ma rozwiązania, aby je usunąć.
Wciąż mając nadzieję na rycerza z klawiaturą shiney;)
Czy na pewno nie ma żadnych wydarzeń? –
Tak, te dwie strony są podzielone na dwa różne projekty i nie mają związku. Ponieważ nie mogą odnosić się do tych samych elementów ze względu na podział w różnych projektach. Nie mówię, że nie ma zdarzeń wewnątrz różnych projektów, dlatego byłoby interesujące usunięcie całego projektu, ponieważ nie miałoby to żadnych problemów z uruchomieniem, ponieważ te odwołania nigdy nie byłyby wywoływane. Myślisz, że wewnętrzne odniesienie do projektów utrzyma je przy życiu bez żadnych odniesień wskazujących na projekt? – JTIM
Myślę, że kiedy ładujesz strony, możesz wypróbować wzór singletonowy –