我有一个ListView
控件从BackgroundWorker
到ReportProgress
接收数据。工人快速连续倾倒大约一百行。每个数据块触发ProgressChanged
事件和GUI线程将新项添加到ListView
。
由于数据检索操作在单独的线程上运行,因此GUI应该在每次更改时更新。但由于某种原因,它不会发生 - 界面在工人完成之前一直处于冻结状态。
有什么想法吗?
此外,测试是在非常快的机器上完成的,所以我认为计算机性能不是问题。
这是一个WinForms应用程序。
答案 0 :(得分:3)
在ReportProgress调用之后将它放在你的BGW工作循环中:
System.Threading.Thread.Sleep(15);
现在看到ListView更新的可能性很大。这里发生的是UI线程充斥着委托调用请求。总是在油漆通知之前发送。如果 next 调用请求在前一个调用请求完成之前到达,则它永远无法执行正常的内务处理任务。喜欢绘画和回应输入。这些项目实际上已添加到列表视图中,您无法看到它已完成。
不经常调用ReportProgress。每秒做25次以上是浪费资源,没有人能看出差异。让BGW将项目存储在List<>中。并通过调用AddRange()来减少UI线程开销。
答案 1 :(得分:1)
您可以尝试使用AddRange而不是Add来批量加载项目到ListView1.Items。只需填写一个中间数组并与AddRange一起使用。
答案 2 :(得分:0)
在ListView
中逐个添加行将导致即使在快速计算机上冻结。
尝试在填充过程之前和之后调用ListView.SuspendLayout()
和ListView.ResumeLayout()
。