VB.NET DataGridView从后台工作程序和SQLDataReader加载数据

VB.NET DataGridView从后台工作程序和SQLDataReader加载数据,vb.net,multithreading,datagridview,backgroundworker,sqldatareader,Vb.net,Multithreading,Datagridview,Backgroundworker,Sqldatareader,好的,我有一个DataGridView,我想加载数据,当数据进入时,我从后台工作程序中运行的SQLDataReader中检索数据(这是一个需要很长时间的查询) 我的目标是让用户体验类似于在Windows中搜索文件,当结果出现在列表中时,您仍然可以与该窗口交互 我让它与后台工作程序和数据读取器一起工作,并尝试从SQLDataReader.Read中添加行,使用BackgroundWorker.ReportProgress方法通读。技术上一切正常,但是闪烁是疯狂的,表单是不可用的(可能不是因为GUI

好的,我有一个DataGridView,我想加载数据,当数据进入时,我从后台工作程序中运行的SQLDataReader中检索数据(这是一个需要很长时间的查询)

我的目标是让用户体验类似于在Windows中搜索文件,当结果出现在列表中时,您仍然可以与该窗口交互

我让它与后台工作程序和数据读取器一起工作,并尝试从SQLDataReader.Read中添加行,使用BackgroundWorker.ReportProgress方法通读。技术上一切正常,但是闪烁是疯狂的,表单是不可用的(可能不是因为GUI线程被阻塞了,只是因为有太多事情发生了…)


有什么想法吗?如何使加载datagridview“平滑”?

您需要限制调用
ReportProgress
的速率。不要每行都调用它。相反,将多行排队,然后调用
ReportProgress
。调整它,以便每隔几秒钟引发
ProgressChanged
事件

老实说,在这种情况下,我发现
BackgroundWorker
会迫使您进行糟糕的设计。我要做的是完全放弃
BackgroundWorker
,手动创建一个新的
线程
任务
,以进行加载。让您的工作线程将行排入
队列
或其他一些数据结构,然后让您的UI线程通过
System.Windows.Form.Timer
定期轮询此队列,以最适合您的时间间隔为准。UI线程将提取一个合理数量的行,并将它们放在网格中,这样它就不会尝试做太多而挂起UI或挂起太少的行,这将花费永远的时间