【发布时间】:2016-03-19 00:57:21
【问题描述】:
我了解如何使用委托来更新主控制线程上的控件,就像一个魅力。我的问题是,如果我向绑定DataGridView 添加一个大的DataSet(比如2000 个项目),填充网格需要5-8 秒,并且在这5-8 秒内整个GUI 被锁定。如何更新DataGridView 使其不锁定用户界面?
需要明确的是,问题不在于我正在对数据库进行慢速查询并且 UI 对此进行了阻塞,我已经有了 DataSet object[] 并将对象数组添加到 BindingList<object> 中DataGrid 必然如此:
BindingList<object> dataProvider = new BindingList<object>();
DataGridView gridView = new DataGridView();
gridView.DataSource = dataProvider;
// ...stuff happens...
object[] source = dataSet; //of 2000 items
foreach (object item in source) { //this foreach blocks
dataProvider.Add(item);
}
我尝试了各种方法(我知道这行不通,但我想我会看到),比如创建一个执行 dataProvider.Add() 的委托,但这并不重要,因为它仍然必须在控制线程上发生。
一些好的建议围绕着首先构建BindingList,然后设置gridView.DataSource。虽然这有效(它会立即更新网格),但我看到添加更多数据的唯一方法是创建另一个新的BindingList,执行gridView.DataSource.copyTo()(获取现有数据)并在其上添加新数据,然后将gridView.DataSource 设置为新的BindingList。这对我不起作用,因为我列表中的对象不是静态的,它们每个都将数据异步上传到服务器,并将它们复制到新的 BindingList 会导致问题。
【问题讨论】:
标签: c# multithreading datagridview delegates nonblocking