2011-12-13 15 views
5

Sto caricando in una vista datagrid alcuni dati (1.200.000 righe), E l'applicazione sta impiegando troppo tempo per caricare e talvolta si blocca.Carica dati in un datagrid in modo asincrono

Non so come caricarli in modo asincrono? (con ProgressBar forse).

Posso trovare aiuto qui?

risposta

3

Suddividere il caricamento dei dati in blocchi più piccoli, ad esempio da 100 a 1000 righe alla volta. Se la griglia WPF è legata alla raccolta dati e la raccolta è una raccolta osservabile (implementa INotifyCollectionChanged), WPF aggiornerà automaticamente la visualizzazione man mano che vengono aggiunti nuovi dati alla raccolta.

Si dovrebbe anche considerare l'utilizzo di controlli elenco virtualizzati o griglie in combinazione con fonti di dati di paging, in modo che sarà caricato solo i dati che è attualmente visualizzata sullo schermo (invece di 1,2 milioni di righe di dati in memoria). Questo eseguirà il "chunking" per te e ti permetterà di presentare una quantità infinita di dati all'utente con un uso di memoria o un ritardo di rete molto basso.

Dai un'occhiata a questo SO articolo sul recupero di dati in modo asincrono per una casella di riepilogo virtuale: How do I populate a ListView in virtual mode asynchronously?

5

Ho un'applicazione in cui sto facendo qualcosa di molto simile utilizzando Threading. Questo codice dovrebbe aggiornare il tuo datagrid una riga alla volta mentre il codice dietro è in esecuzione.

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))); 
    }  
} 
Problemi correlati