将数据异步加载到数据网格中
问题描述:
我在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)));
}
}