我从一开始就在WinForms客户端中使用异步操作,但仅限于某些操作。当ExecuteReader
或ExecuteNonQuery
完成时,回调委托会触发,一切正常。
我基本上有两个问题:
1)在现实生活系统中处理这个问题的最佳结构是什么?我看到的所有示例都是玩具示例,其中表单处理操作完成,然后在EndExecuteReader
上打开datareader。当然,这意味着表单与数据库的关联程度比您通常所希望的更紧密。当然,表单总是可以轻松地调用.Invoke
。我已经设置了所有异步对象以从AsyncCtrlBlock<T>
类继承,并将表单和所有回调委托提供给我的DAL中的异步对象的构造函数。
2)我将重新访问当前不是异步的程序的一部分。它会串联两个电话。第一个完成后,可以填充部分模型。当第二个完成时,模型的剩余部分可以完成 - 但仅当第一部分已经完成时。构建这个的最佳方法是什么?如果可以完成第一次读取并且第二次读取时第一次读取的处理正在进行,那将是很好的,但是我不希望第二次读取的处理开始,直到我知道处理第一读数据已经完成。
答案 0 :(得分: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
答案 1 :(得分: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);