.net - 在 BackgroundWorker 中加载数据时 GUI 卡住

标签 .net multithreading user-interface backgroundworker

我有一个 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/

相关文章:

.net 架构 : Creating a IRepository<T> generically

asp.net - 如何检索 Sitecore 超链接?

.net - 日志记录框架和多线程兼容性

Java GUI 动态添加按钮

JavaFX ActionEvent 矩形

c# - 列出网络位置的所有共享文件夹

c# - 是否有适用于 Windows 的具有高可用性选项的可查询分布式缓存?

java - ThreadPoolExecutor 仅运行第一个可运行对象

Java 同步(对象锁定)未按预期工作

java - 是否可以在 Java 中构建这样的自定义 GUI?