将数据异步加载到数据网格中

问题描述:

我在datagrid视图中加载了一些数据(1,200,000行),并且该应用程序需要花费太多时间才能加载并且有时会冻结。将数据异步加载到数据网格中

我不知道如何异步加载它们? (可能有progressBar)。

我可以在这里找到一些帮助吗?

将数据加载分解为更小的数据块,例如每次处理100到1000行。如果WPF网格将数据绑定到数据集合,并且集合是可观察集合(实现INotifyCollectionChanged),那么当新数据添加到集合时,WPF将自动更新显示。

您还应该考虑将虚拟化列表控件或网格与分页数据源结合使用,以便只载入当前显示在屏幕上的数据(而不是内存中的120万行数据)。这将为您执行“分块”,并使您能够基本上向用户呈现无限量的数据,而只需很少的内存使用或网络延迟。

退房这对异步检索数据的虚拟列表框SO文章:How do I populate a ListView in virtual mode asynchronously?

我在我做的非常相似的使用线程的东西的应用程序。这段代码应该在代码后台运行时一次更新你的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))); 
    }  
}