首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#后台工作程序UI更新

C#后台工作程序UI更新
EN

Stack Overflow用户
提问于 2010-08-04 23:34:55
回答 4查看 1.3K关注 0票数 5

我正在尝试使用后台工作程序,以便在不停止主线程的情况下从数据库中检索大量数据。这似乎工作得很好,除了在更新UI时,更新会冻结屏幕。相关代码如下:

代码语言:javascript
复制
    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的另一个实例中)将这些数据加载到内存中,然后直接显示它?我只想让程序简单地刷新数据,而不占用主线程的时间。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-08-04 23:42:19

我建议将数据加载到内存中并使用虚拟模式ListView。这样,您只需在需要时创建ListViewItem对象。

票数 1
EN

Stack Overflow用户

发布于 2010-08-04 23:40:51

如果你必须将大量的数据加载到UI中,这将需要时间,并且会阻塞我们的应用程序。选项是智能滚动或分页。您加载所有数据,但根据用户请求将其逐段放入。

票数 1
EN

Stack Overflow用户

发布于 2010-08-04 23:42:19

除了虚拟化之外,我还建议将这些项目分成多个批次,比如100个,并将每个批次添加到各自的消息中。这样,在将批处理添加到ListView时,UI可以更改为处理其他消息。

换句话说,RunWorkerCompleted处理程序所做的全部工作就是对第一批进行排队,以便添加到单独的消息中。adding方法随后将添加项目,然后对下一批进行排队。这将继续下去,直到没有更多的项目可供添加。此时,您将重新启用UI的相关部分( ListView)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3407165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档