2013-07-15 17 views
8

Planowałem zbudować strukturę aplikacji biznesowych WPV MVVM i natknąłem się na wiele artykułów podczas badań, które mówią o wyciekach pamięci w platformie WPF.Wycieki pamięci, które wciąż są obecne w WPF 4

A memory leak may occur when you use data binding in Windows Presentation Foundation
Avoiding a WPF memory leak with DataBinding (Black Magic)
Serious Memory Leaks Plague WPF
Top 5 Memory leaks in WPF and Silverlight
WPF Binding Bug leads to possible Memory Issues

Ale większość z nich sięgają roku 2007 i 2008, więc zastanawiałem się, który z nich został rozwiązany, a które nie.

Innymi słowy, jakie są możliwe źródła wycieków pamięci (które mogą się zdarzyć) do uwzględnienia podczas budowania mojej architektury lub ogólnego oglądania (WPF 4.0, .NET 4.0)?

Edytuj: Spróbuję być bardziej konkretny. Czy mogę skorzystać z WeakEventManager i jego podklas, aby słuchać wydarzeń bez konieczności opracowywania własnego rozwiązania?

Edytuj 2: Jeszcze bardziej szczegółowe. Czy mogę użyć WeakEventManager do rozwiązania problemu wycieku pamięci spowodowanego przez zdarzenia w .NET w ogóle, a nie tylko WPF? Jeśli tak, dlaczego jest częścią przestrzeni nazw WPF, a nie ogólną przestrzenią nazw .NET?

+4

Czy możesz dodać kilka konkretnych linków? Nieporozumienia dotyczące odniesień do zdarzeń były częstym źródłem błędnych raportów o "wycieku pamięci" - poszukaj WeakEvent na początek. – Govert

+0

@Govert Dodałem kilka linków. –

+0

Zastanawiam się tylko, dlaczego ktoś może głosować, aby zamknąć to pytanie, jaki jest stan naruszenia lub co jest z nim w ogóle? !! –

Odpowiedz

8

Pierwsza, która przychodzi mi do głowy:

  • System.Windows.Interactivity.Behavior z System.Windows.Interactivity.dll: zachowanie nie może odłączyć gdy można oczekiwać, że i na odwrót, pozostawiając dodatkową imprezę Wózek na kontrolę przetrwać GC
  • Wystarczy Twój opis jestem całkiem pewny you'll używać innych firm-komponentów w przyszłości okazało się, że jest to pierwszej klasy kandydat szczelność

Fakt, że rozważasz to przed rozpoczęciem, to ap lus, zainwestuj w dobry MemoryProfiler i profiluj swoją aplikację od samego początku regularnie, a wszystko będzie dobrze.

Edit: Aby komentować Twoich zmian: Kontrola poprzez linki myślę, że można Izolowanie trzy główne tematy:

  • wykonawcze INotifyPropertyChanged jest koniecznością. Twój pierwszy programista, który mówi ci "to tylko statyczny widok, dane nie zmienią się w moim modelu, po prostu pominąłem INPC" musi być narysowany i poćwiartowany publicznie. Co więcej, Twoja struktura powinna wymuszać implementację tego interfejsu lub przynajmniej ułatwić programistom korzystanie z niego.
  • Dont powiązać z PropertyDescriptors, co może nie być oczywiste, ale system może ustawić ścieżkę dla programistów używających go tylko do powiązania z niestandardowymi właściwościami viewmodel.
  • Zawsze wyrejestrować swoją eventhandler, co moim zdaniem jest bardziej kwestia kodu higieny

Jak do edycji dotyczącej słabych imprez, tak to może działać. Osobiście nie brałbym pod uwagę tej dobrej praktyki, ponieważ może to prowadzić do sytuacji, w których model ujawniający zdarzenia, na które się rejestrujesz, zostanie wyczyszczony wcześniej, niż tego oczekujesz. Sugerowałbym, aby przejść dalej i świadomie wyrejestrować swojego przewodnika.

+0

+1 dla wglądu strony trzeciej. Jeśli masz czas, byłbym wdzięczny, gdybyś uzupełnił swoją odpowiedź o tym, jak wyizolowałeś i wykryłeś ml w tych składnikach. Zgaduję, że jest to problem wspólny dla wielu osób –

+0

+1 za wyciek Zachowania * (jeszcze jeden wyciek, którego nie znałem) *. Rozważę Twoje sugestie, ale czy możesz ponownie rozważyć swoją odpowiedź, ponieważ wprowadziłem kilka zmian do mojego pierwotnego pytania? Dziękuję Ci. –

+0

Re: Zachowania ... Śledziłem [ten przewodnik] (http://dotnetbyexample.blogspot.com/2011/04/safe-event-detachment-pattern-for.html), aby bezpiecznie odłączyć od AssociatedObject – Thelonias

Powiązane problemy