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.