我正在尝试使用后台工作程序,以便在不停止主线程的情况下从数据库中检索大量数据。这似乎工作得很好,除了在更新UI时,更新会冻结屏幕。相关代码如下:
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
lvwTest.BeginUpdate();
lvwTest.Items.Clear();
// Populate the UI
foreach (TestItem ti in testData)
{
ListViewItem lvi = lvwTest.Items.Add(ti.Value1);
lvi.SubItems.Add(ti.Value2);
}
lvwTest.EndUpdate();
}更新大约需要2-3秒,在这段时间内屏幕被锁定。我意识到只有主线程可以更新屏幕,但有没有可能以某种方式(在后台线程或listview的另一个实例中)将这些数据加载到内存中,然后直接显示它?我只想让程序简单地刷新数据,而不占用主线程的时间。
发布于 2010-08-04 23:42:19
我建议将数据加载到内存中并使用虚拟模式ListView。这样,您只需在需要时创建ListViewItem对象。
发布于 2010-08-04 23:40:51
如果你必须将大量的数据加载到UI中,这将需要时间,并且会阻塞我们的应用程序。选项是智能滚动或分页。您加载所有数据,但根据用户请求将其逐段放入。
发布于 2010-08-04 23:42:19
除了虚拟化之外,我还建议将这些项目分成多个批次,比如100个,并将每个批次添加到各自的消息中。这样,在将批处理添加到ListView时,UI可以更改为处理其他消息。
换句话说,RunWorkerCompleted处理程序所做的全部工作就是对第一批进行排队,以便添加到单独的消息中。adding方法随后将添加项目,然后对下一批进行排队。这将继续下去,直到没有更多的项目可供添加。此时,您将重新启用UI的相关部分( ListView)。
https://stackoverflow.com/questions/3407165
复制相似问题