我有一个 ListView
控制从 BackgroundWorker
接收数据通过ReportProgress
. worker 快速连续地倾倒了大约一百行。每 block 数据都会触发 ProgressChanged
事件和 GUI 线程将新项目添加到 ListView
.
由于数据检索操作在单独的线程上运行,因此 GUI 应该在每次更改时更新。但由于某种原因,它没有发生 - 界面保持卡住状态,直到工作人员完成。
有任何想法吗?
此外,测试是在非常快的机器上完成的,所以我认为计算机性能不是问题。
这是一个 WinForms 应用程序。
最佳答案
在 ReportProgress 调用之后,将其放入您的 BGW 工作循环中:
System.Threading.Thread.Sleep(15);
您现在看到 ListView 更新的可能性很大。这里发生的是 UI 线程充斥着委托(delegate)调用请求。总是在绘制通知之前发送。如果下一个调用请求在前一个调用请求完成之前到达,那么它就永远无法完成正常的内务处理任务。就像绘画和响应输入一样。这些项目实际上确实被添加到 ListView 中,您只是看不到它正在完成。
减少调用 ReportProgress 的频率。每秒执行超过 25 次是浪费资源,没有人可以看到其中的差异。让 BGW 将项目存储在 List<> 中,并通过调用 AddRange() 减少 UI 线程开销。
关于.net - 在 BackgroundWorker 中加载数据时 GUI 卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4944051/