2016-02-08 25 views
7

Mam przycisk dialogowy uruchamiania, który tworzy model widoku okna i wiąże go z oknem (po włączeniu wirtualizacji interfejsu użytkownika). Uruchomienie okna dialogowego za pierwszym kliknięciem zajmuje tylko 1 sekundę. Ale jeśli otworzę ten sam dialog bardzo często lub z powrotem, zacznie on zabierać więcej czasu na zapełnianie źródła danych siatki dla następnej iteracji. jeśli zrobię przerwę, a następnie ponownie otworzę okno, to zajmie to tylko około 1 lub 2 sekund.Problem związany z wydajnością podczas wielokrotnego otwierania okna dialogowego w wpf

for first time populating the item source it take only 1 second: 
next time populating the item source it takes 2 second 
next time populating the item source it takes 3 second 
next time populating the item source it takes 6 second 
next time populating the item source it takes 8 second 

Jednak jeśli zadzwonię GC.Collect(), która nie jest zalecane, a następnie wypełnianie źródło danych siatki zawsze trwa około 1 sekundę. ale wywołanie kosztowało mnie trochę czasu dla każdej iteracji.

Wiem, że dzwonienie pod numer GC.Collect nie jest dobrym rozwiązaniem. Czy ktoś może zasugerować, w jaki sposób mogę zwiększyć wydajność mojej aplikacji.

Jestem bardziej zaniepokojony maszyną użytkownika, ponieważ moja maszyna ma bardzo dobrą konfigurację, podczas gdy maszyna użytkownika może nie być tak szybka.

+1

Dlaczego otwieranie okna dialogowego zajmuje więcej czasu? Może ładujesz zbyt dużo danych. Rozważ użycie stronicowania (http://stackoverflow.com/questions/784726/how-can-i-paginate-a-wpf-datagrid) (w siatce iw zapytaniu sql). –

+0

Może trzeba ".Uzyskać" niektórych zasobów przed zamknięciem okna dialogowego? –

+0

Tim, ja też nie rozumiem. prawdopodobnie brakuje mi czegoś, ale nie wiem co. Poszukuję możliwych błędów –

Odpowiedz

3

Trudno jest dokładnie określić problem bez patrzenia na kod. Zwykle jednak może się to zdarzyć z kilku powodów.

  1. Ładuje więcej danych (może być podwójna?) Evertime. Wskazałeś, że ładuje za każdym razem tylko 200 rekordów. Upewnij się jednak, że logika jest poprawna i usuwa wcześniejsze dane przed ponownym opublikowaniem.

  2. Pamiętaj, aby zrezygnować z subskrypcji dowolnego wydarzenia. Czasami zdarzają się hiden zdarzenia wywołujące poprzednie instancje siatki. Możesz to łatwo sprawdzić, umieszczając przerwę na równym uchwycie i sprawdzając, czy uruchamia się więcej niż jeden raz.

  3. Przyjrzyj się każdemu tworzonemu jednorazowemu wystąpieniu i sprawdź, czy je odpowiednio utylizujesz. Prawdopodobnie nie dysponuję jednorazową instancją i może to być przyczyną pomocy GC.Collect.

  4. Nie jestem do końca przekonany o zaangażowaniu w wirtualizację. Wykonaj ten sam test bez wirtualizacji, aby upewnić się, że nie jest to powód.

+0

dzięki CharithJ, doszedłem do wniosku, że było to spowodowane wydarzeniami, których nie anulowałem, ale wciąż zastanawiam się, czy to zdarzenie nie zostało automatycznie podniesione, ponieważ ręcznie podnosimy to zdarzenie, wykonując tylko określone działania. Więc nie powinno to mieć wpływu na wydajność. Teraz jestem bardziej zainteresowany faktem, że przechowywanie tak wielu programów obsługi zdarzeń powoduje wpływ na wydajność. Nie rozumiem tego. pod względem pamięci nie zajmowały tyle pamięci. nawet jeśli zajmują więcej, to jak wpływa na wydajność. czy możesz mi coś na ten temat powiedzieć? –

+0

Nie ma potrzeby zajmowania dużej ilości pamięci, aby zwiększyć problemy z pamięcią. Może masz do czynienia z dużymi obiektami? Czytać o https://www.simple-talk.com/dotnet/.net-framework/the-dangers-of-the-large-object-heap/ Pamiętaj, aby pozbyć się wszystkich przedmiotów jednorazowego użytku, zanim wyjdą poza zakres . Zaimplementuj interfejs IDisposable i anuluj subskrypcję wszelkich zdarzeń w metodzie Dispose. – CharithJ

+0

wielkie dzięki za udostępnienie tego artykułu, właśnie tego szukałem –