2

我从一开始就在我的 WinForms 客户端中使用异步操作,但仅用于某些操作。当ExecuteReaderorExecuteNonQuery完成时,回调委托触发并且一切正常。

我基本上有两个问题:

1)在现实生活系统中处理这个问题的最佳结构是什么?我看到的所有示例都是玩具示例,其中表单处理操作完成,然后在EndExecuteReader. 当然,这意味着表单与数据库的耦合比您通常想要的更紧密。而且,当然,表单总是可以很容易地调用.Invoke自己。我已将所有异步对象设置为从一个AsyncCtrlBlock<T>类继承,并将表单和所有回调委托提供给我的 DAL 中异步对象的构造函数。

2)我将重新访问当前不是异步的程序的一部分。它连续进行两次调用。当第一个完成时,可以填充模型的一部分。当第二部分完成时,模型的剩余部分可以完成 - 但前提是第一部分已经完成。构建这个的最佳方法是什么?如果可以完成第一次读取并且在启动第二次读取时正在进行由于第一次读取而导致的处理,那就太好了,但是我不希望在我知道第二次读取的处理之前开始第二次读取的处理第一次读取的数据已经完成。

4

2 回答 2

0

如果您使用的是 .Net 4,这将是 TPL 的理想应用!您可以将代码分解为如下任务:

TaskScheduler uiScheduler = GetUISheduller();
SqlCommand command1 = CreateCommand1();

Task<SqlDataReader> query1 = Task<SqlDataReader>.Factory.FromAsync(command1.BeginExecuteReader, command1.EndExecuteReader, null);
query1.ContinueWith(t => PopulateGrid1(t.Result), uiScheduler);

SqlCommand command2 = CreateCommand2();
query1.ContinueWith(t => Task<SqlDataReader>.Factory.FromAsync(command2.BeginExecuteReader, command2.EndExecuteReader, null)
      .ContinueWith(t => PopulateGrid2(t.Result), uiScheduler);
于 2012-04-20T04:17:25.650 回答
0

关于 2)

使模型的第一阶段填充异步。你会有类似的东西


FisrtCall();
AsyncResult arPh1 = BeginPhaseOne(); //use results from first call
SecondCall();
EndPhaseOne(arPh1); //wait until phase one is finished
PhaseTwo(); //proceed to phase two

于 2010-06-25T13:36:20.503 回答