【问题标题】:VB.NET DataGridView load data from a background worker and SQLDataReaderVB.NET DataGridView 从后台工作者和 SQLDataReader 加载数据
【发布时间】:2012-03-28 18:07:19
【问题描述】:
好的,我有一个 DataGridView,我想在数据进入时加载从后台工作程序中运行的 SQLDataReader 检索的数据(这是一个需要很长时间的查询)。
我的目标是让用户体验类似于在 Windows 中搜索文件,结果出现在列表中,并且您仍然可以与窗口进行交互。
我让它与后台工作人员和数据阅读器一起工作,我正在尝试使用 BackgroundWorker.ReportProgress 方法从 SQLDataReader.Read 添加行。技术上一切正常,但闪烁很疯狂,表单无法使用(可能不是因为 GUI 线程被阻塞,而是因为发生了太多事情......)
有什么想法吗?如何使加载数据网格视图“顺利”?
【问题讨论】:
标签:
vb.net
multithreading
datagridview
backgroundworker
sqldatareader
【解决方案1】:
您需要限制调用ReportProgress 的速率。不要为每一行调用它。相反,排队几行,然后调用ReportProgress。对其进行调整,使ProgressChanged 事件每隔几秒触发一次。
不过,老实说,在这种情况下,我发现BackgroundWorker 迫使您进行糟糕的设计。我要做的是完全放弃BackgroundWorker 并手动创建一个新的Thread 或Task 来进行加载。让您的工作线程将行排入Queue<T> 或其他一些数据结构,然后让您的UI 线程通过System.Windows.Form.Timer 定期轮询此队列,以最适合您的时间间隔进行。 UI 线程将提取合理数量的行并将它们放置在网格中,它不会尝试做太多并挂断 UI 或太少,这将永远花费。