2013-04-13 94 views
2

我相信大家都很熟悉了填充数据到使用Visual Studio中的数据绑定控件的传统方式。该VS创建一个强类型DataSet和调用DataAdapter对窗体加载事件中填充功能,正如下面给出的代码:异步填充强类型数据集

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

一切都运行完美,除非有数据的负载从数据库中提取。

当我们在数据库中超过500K元组,和搜索需要在服务器端完成,甚至的SQL Server需要一些时间来恢复数据。在这段时间内,Windows窗体的UI变得无法响应。

对于大量数据的UI仍然没有响应相当长的时间,这是不能接受的。

所以,我的问题是,是否有填充数据的任何异步方式,使用户界面保持响应,我们可能会显示加载动画或其他任何东西,我们希望,给用户。

我希望我已经说清楚了。

回答

2

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

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

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

+0

那是它? C#4或5对此没有提供什么? –

+1

你误解了一种语言可以做什么。一种语言是一种编码习惯,没有任何行动代码可言。它不能用于改变其他人编写的代码的行为。您可以移动创建表格适配器的代码,并通过System.Threading,WinForms BackgroundWorker或PPL将数据库查询到后台线程。但这与C#提供的内容无关。 –

+0

谢谢你的详细回复。我明白,除非我们编码,否则一种语言无法说明自己。我问的是,有没有什么办法从db中获取数据,同时保持UI线程响应。我知道我们可以使用MultiThreading或BackgroundWorker来完成相同的任务,但我想知道是否有任何解决方法来填充强类型的DS,同时保持UI响应? –