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?