C# 在BackgroundWorker线程中更新DataGrid

C# 在BackgroundWorker线程中更新DataGrid,c#,winforms,C#,Winforms,我有一个返回数百行的SQL查询,我需要将它们添加到WinForms数据网格中,这样用户在添加行时仍然可以查看/滚动数据网格 目前,我正在使用BackgroundWorker线程来执行SQL语句,并在使用Control.BeginInvoke将每一新行传递回UI线程之前在DataReader中循环行,在UI线程中将新行添加到绑定到DataGrid的DataTable中。这并没有真正达到预期的效果(更新DataGrid需要一段时间,然后在更新一次之后,UI变得没有响应) 有没有办法做我想做的事,如果

我有一个返回数百行的SQL查询,我需要将它们添加到WinForms数据网格中,这样用户在添加行时仍然可以查看/滚动数据网格

目前,我正在使用BackgroundWorker线程来执行SQL语句,并在使用Control.BeginInvoke将每一新行传递回UI线程之前在DataReader中循环行,在UI线程中将新行添加到绑定到DataGrid的DataTable中。这并没有真正达到预期的效果(更新DataGrid需要一段时间,然后在更新一次之后,UI变得没有响应)

有没有办法做我想做的事,如果有,怎么做


编辑:我在worker线程中添加了一个thread.sleep,因为它在datareader中循环,这可以阻止UI在第一次更新后变得无响应,但它仍然没有我希望的那样响应(滚动有点跳跃,因为在UI线程中添加一行似乎会窃取焦点).

您看过DataGridView控件的虚拟模式了吗?它可以提供某种方式,仅迭代需要查看的行(即,仅在用户滚动时获取数据)

见:

PS:DataGrid已旧,请尝试DataGridView:)

目前我正在使用BackgroundWorker线程来执行SQL 语句,并在使用之前遍历DataReader中的行 Control.BeginInvoke将每一新行传递回UI线程,其中 它被添加到绑定到DataGrid的DataTable中

您似乎正在使用Dispatcher更新UI。那不是个好主意。在多线程环境中使用datagrid很棘手。我在这里发布了一个模板。它介绍了在多线程设置中使用datagrid的一种可能方法


我现在要调查一下。感谢您的快速回复:)