我相信每个人都熟悉使用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保持响应状态,我们可能会向用户显示加载动画或其他所需内容。

我希望我已经说清楚了。

最佳答案

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

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

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

07-24 19:12
查看更多