2011-12-13 12 views
5

Ładowanie danych w widoku datagrid niektóre dane (1 200 000 wierszy), a aplikacja zajmuje zbyt dużo czasu, aby załadować i czasami zawiesza się.Ładowanie danych do asynchronicznie datagrid

Nie wiem, jak załadować je asynchronicznie? (z może być progressBar).

Czy mogę znaleźć pomoc?

Odpowiedz

3

Podziel dane na mniejsze porcje, powiedzmy od 100 do 1000 wierszy na raz. Jeśli siatka WPF jest databound do zbierania danych, a kolekcja jest obserwowalna kolekcja (implementuje INotifyCollectionChanged), WPF automatycznie zaktualizuje wyświetlanie, gdy nowe dane zostaną dodane do kolekcji.

Należy również rozważyć użycie wirtualnych kontrolek lub siatek list w połączeniu ze źródłami danych stronicowania, aby wczytać tylko te dane, które są aktualnie wyświetlane na ekranie (zamiast 1,2 mln wierszy danych w pamięci). Spowoduje to wykonanie "chunkingu" dla ciebie i umożliwi prezentowanie w zasadzie nieskończonej ilości danych użytkownikowi z bardzo małym zużyciem pamięci lub opóźnieniem sieci.

Sprawdź ten artykuł na SO pobierania danych asynchronicznie na wirtualnym polu listy: How do I populate a ListView in virtual mode asynchronously?

5

Mam aplikacji, w których robię coś bardzo podobnego używając Threading. Ten kod powinien zaktualizować twój datagrid o jedną linię naraz, podczas gdy działa kod.

using System.Windows.Threading; 

private void Run() 
{ 
    try 
    { 
     var t = new Thread(Read) { IsBackground = true }; 
     t.Start(); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

private void Read() 
{ 
    foreach (/* whatever you are looping through */) 
    { 
     /* I recommend creating a class for the result use that for the 
      datagrid filling. */ 
     var sr = new ResultClass() 

     /* do all you code to generate your results */ 

     Dispatcher.BeginInvoke(DispatcherPriority.Normal, 
           (ThreadStart)(() => dgResults.AddItem(sr))); 
    }  
} 
Powiązane problemy