好的,我有一个DataGridView,我想加载数据,我正在从后台工作程序中运行的SQLDataReader中检索数据(这是一个需要很长时间的查询)。
我的目标是让用户体验类似于在Windows中搜索文件,结果会在列表中显示,并且您仍然可以与窗口进行交互。
我让它与后台工作者和数据阅读器一起工作,我正在尝试通过使用BackgroundWorker.ReportProgress方法从SQLDataReader.Read添加行。一切都在技术上有效,但闪烁是疯狂的,形式是无法使用的(可能不是因为GUI线程被阻止,只是因为有太多的事情发生......)
有什么想法吗?如何使datagridview加载“流畅”?
答案 0 :(得分:0)
您需要限制调用ReportProgress
的速率。不要为每一行调用它。而是排队几行,然后调用ReportProgress
。调整它以便每隔几秒钟就会引发ProgressChanged
事件。
老实说,这是一个我发现BackgroundWorker
迫使你陷入糟糕设计的场景。我要做的是完全放弃BackgroundWorker
并手动创建新的Thread
或Task
来进行加载。让您的工作线程将行排队到Queue<T>
或其他一些数据结构中,然后让您的UI线程通过System.Windows.Form.Timer
定期轮询此队列,无论哪个区间最适合您。 UI线程将提取合理数量的行并将它们放在网格中,它不会尝试做太多而挂起UI或太少,这将永远需要。