Windows窗体客户端中数据库访问的最佳线程模型是什么?

时间:2010-11-04 10:32:33

标签: sql-server winforms

这是一个非常标准的设置,WinForms客户端>自助式业务/数据层> SQL Server(存储过程)。

目前,我的WinForms调用抓取数据将会像是一样 MyData = RecipientInfo.GetListings(<options>)。然后它将使用所述数据填充UI,主要是通过Binding,因为所有对象都支持BindingList和INotifyPropertyChanged等内容。

GetListings()函数执行两项操作。首先,它获取一个查找数据列表,然后一旦从DataReader填充该结构,另一个函数将关闭并通过调用另一个对象静态GetOtherRelatedStuff(<stuffId>)方法进行更多数据库访问。然后将对其进行排序和分组。

我认为我的问题实际上更多的是品味问题,但如果我想处理我的SQL(DataReaders和喜欢手动填充我的对象),然后对数据做一些基本分析,这里有明显的选择。用户正在等待。

  1. 让我的初始数据访问机制使用IAsyncResult模式,我的WinForm会期待回调
  2. 准备好后,使用SqlCommands BeginExecuteReader()函数和回调。这对我的调用代码没有帮助,所以我必须连接一个双回调例程来通知WinForms客户端什么时候完成工作
  3. 活动?可能不会。
  4. BackgroundWorker的?这很好,我以前用过这个很成功,但它确实感觉有点以UI为中心(这真的是这个例外)。
  5. 在我的WinForms调用代码中使用并行扩展中的任务。我猜测我的SQL工作的实际数据层代码将像往常一样同步编写,WinForm将负责运行它并在完成时处理UI。
  6. 事实上,我也可以像AsParallel一样在内部使用帮助程序来协助在SQL工作完成后获取方法和数据分组/排序的额外数据。

    任务也使单元测试变得更加容易,因为我的数据访问代码以易于执行的方式编写。

    我错过了什么?

1 个答案:

答案 0 :(得分:0)

好的,所以这是一个非常主观的问题,但我决定从TPL开始执行任务,从我的WinForms客户端执行。

我的“业务层”接受了一个长期工作的CancellationToken,它被分解为许多特定的例程,以帮助并行化多阶段流程。

SQL是同步完成的,但是通过任务运行它是自动线程的。虽然我必须仔细考虑WinForms代码以符合特定的数据要求,但它很容易被分解,并且很好地将解决方案联系在一起。