2011-12-13 55 views
5

我在datagrid視圖中加載了一些數據(1,200,000行),並且該應用程序需要花費太多時間才能加載並且有時會凍結。將數據異步加載到數據網格中

我不知道如何異步加載它們? (可能有progressBar)。

我可以在這裏找到一些幫助嗎?

回答

3

將數據加載分解爲更小的數據塊,例如每次處理100到1000行。如果WPF網格將數據綁定到數據集合,並且集合是可觀察集合(實現INotifyCollectionChanged),那麼當新數據添加到集合時,WPF將自動更新顯示。

您還應該考慮將虛擬化列表控件或網格與分頁數據源結合使用,以便只載入當前顯示在屏幕上的數據(而不是內存中的120萬行數據)。這將爲您執行「分塊」,並使您能夠基本上向用戶呈現無限量的數據,而只需很少的內存使用或網絡延遲。

退房這對異步檢索數據的虛擬列表框SO文章:How do I populate a ListView in virtual mode asynchronously?

5

我在我做的非常相似的使用線程的東西的應用程序。這段代碼應該在代碼後臺運行時一次更新你的datagrid。

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