【问题标题】:Asynchronously fill a Strongly Typed Dataset异步填充强类型数据集
【发布时间】:2013-04-13 12:01:16
【问题描述】:

相信大家都熟悉使用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 保持响应,并且我们可能会向用户显示加载动画或我们想要的任何其他内容。

我希望我已经说清楚了。

【问题讨论】:

    标签: c# .net winforms data-binding asynchronous


    【解决方案1】:

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

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

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

    【讨论】:

    • 就这样? C# 4 或 5 对此没有什么可提供的吗?
    • 您误解了语言的功能。语言是一种编码约定,没有可言的操作代码。它不能用于更改其他人编写的代码的行为。您可以通过 System.Threading、WinForms BackgroundWorker 或 PPL 将创建表适配器和查询数据库的代码移动到后台线程。但这与 C# 提供的功能无关。
    • 感谢您的详细回复。我知道除非我们编码,否则语言无法自言自语。我要问的是,有什么方法可以在保持 UI 线程响应的同时从 db 获取数据。我知道我们可以使用 MultiThreading 或 BackgroundWorker 来完成相同的任务,但我想知道是否有任何解决方法来填充强类型 DS 同时保持 UI 响应?
    • db 引擎挂起一个线程。要保持 UI 响应,请挂起一个后台线程。
    猜你喜欢
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 2018-08-11
    相关资源
    最近更新 更多