2

相信大家都熟悉使用Visual Studio将数据填充到数据绑定控件中的传统方式。VS 创建一个强类型的 DataSet 并在表单加载事件中调用 DataAdapter 的 Fill 函数,就像下面给出的代码一样:

this.applications_infoTableAdapter.Fill(this.bITSS_UIT_dBDataSet_tmpApplication.Applications_info, textBox1.Text);

一切都很完美,除非从数据库中获取大量数据。

当我们在数据库中有超过 500K 的元组,并且需要在服务器端进行搜索时,即使是 sql server 也需要一些时间才能返回数据。在这段时间内,Windows 窗体的 UI 变得无响应。

对于大量数据,UI 在相当长的时间内保持无响应,这是不可接受的。

所以,我的问题是,是否有任何异步方式来填充数据,以便 UI 保持响应,并且我们可能会向用户显示加载动画或我们想要的任何其他内容。

我希望我已经说清楚了。

4

1 回答 1

2

类型化数据集中没有异步填充。查询在数据库上运行,而不是在您的代码中。数据库引擎可以使用多个内核进行查询,但只有在查询完成并且结果通过线路同步发送回时才会返回填充调用。您可以通过 BeginLoadData 关闭数据表中的簿记,但这不会改变数据库服务器处理您的查询的方式。

如果您的服务器是 SQL Server,您可以将 SqlClient async 与启用了 async=true 的 SqlConnection 一起使用,但是类型化的数据集不会生成使用 SQL Server 提供程序的代码,您需要以某种方式修补设计器生成的代码以使用 sql服务器对象而不是通用对象。

一种更简单的方法是通过 System.Threading、Background Worker 或 PPL 将表适配器的创建和填充移动到后台线程,因此它会挂起另一个线程。如果要暂停或恢复数据填充,则需要重写查询以支持分页。

于 2013-04-13T13:13:58.510 回答