Długie ładowanie danych do DataGrid

0

Witam,

podczas pisania aplikacji WPF napotkałem problem. Otóż chodzi o ładowanie danych. Przy danych rzędu setek jest ok, bo trwa to około sekundy, ale testowo wrzuciłem do bazy 100 tys rekordów i jednak okno nie startuje dopóki nie załaduje danych do DataGrid. Rozwiązałem to w ten sposób, że w CodeBehind zdarzenie window loaded wywołuje mi metodę LoadDataToTabs we ViewModelu, która wygląda tak: (poniżej metoda, która jest wywoływana przez tą pierwszą w tle).

Chodzi mi o sugestie jak to się rozwiązuje poprawnie, bo to jest tylko mój działający pomysł. Próbowałem odpalać od razu drugą metodę z pominięciem pierwszej, gdzie robiłem ją async i korzystałem z async w bazie, jak i w serwisach, jednak również okno pojawiało się dopiero po załadowaniu danych, więc tutaj z tego nie korzystam.

Czy można prosić o jakieś sugestie jak to zrobić lepiej? Może tę metodę odpalać w konstruktorze ViewModelu? Dodam, że dane są ładowane do trzech DataGrid.
Wiem, że powinienem korzystać z async await, ale czy ktoś mi może wytłumaczyć z jakiego powodu (przynajmniej na forum tutaj przeczytałem kiedyś) zalecane jest korzystanie prawie wszędzie z async await? Skoro okno i tak mi się blokuje i czeka na dane. Proszę wybaczyć za głupie pytania, jednak nie mogę do końca zrozumieć idei tego, z tego co czytałem jest to "ulepszenie" wprowadzone, aby nie trzeba było tworzyć nowych wątków itd, ale u mnie ręczne stworzenie wątku działa, a async await nie.

        public void LoadDataToTabs()
        {
            try
            {
                var t = new Thread(ReadData) { IsBackground = true };
                t.Start();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }

        private void ReadData()
        {
            IsLoadingData = true;
            DuringRepairs = repairService.GetDuringRepairs().ToObservableCollection();
            OverdueRepairs = repairService.GetOverdueRepairs().ToObservableCollection();
            CompletedRepairs = repairService.GetCompletedRepairs().ToObservableCollection();
            IsLoadingData = false;
        }

EDIT: Dodam jeszcze, te 100 tys to jest tylko testowo, to jest główne okno programu tutaj ograniczę ilość wyników do max 200, jednak w dedykowanym oknie do wyświetlania tych danych planuję zrobić stronicowanie wyników, gdyż nawet załadowanie ich w innym wątku zabiera dodatkowo 500MB pamięci.

0

dodaj paginacje, czyli pobierze X rekordow i dopiero jak bedziesz przechodzil w dany punkt bedzie pobieral kolejne X+Przesuniecie

0

Owszem dodam, ale to dla mnie póki co nie takie proste. Tzn sama paginacja jest w miarę prosta, jednak muszę brać pod uwagę, że DataGrid można sortować klikając na nazwę kolumny. Jeśli zrobię prostą paginację to będzie mi filtrować konkretnie załadowane dane, a chcę aby mi przefiltrowało wszystko i zresetowało numer strony, ewentualnie zostało na tej samej, ale z przefiltrowanymi danymi na poziomie bazy, a nie widoku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1