2

最初から WinForms クライアントで非同期操作を使用していますが、一部の操作のみです。ExecuteReaderまたは が完了するExecuteNonQueryと、コールバック デリゲートが起動し、すべてが正常に機能します。

私は基本的に2つの問題を抱えています:

1) 実際のシステムでこれを処理するための最良の構造は何ですか? 私が見たすべての例は、フォームが操作の完了を処理し、EndExecuteReader. もちろん、これは、フォームが通常よりもデータベースに緊密に結合されていることを意味します。そしてもちろん、フォームはいつでも簡単.Invokeにそれ自体を呼び出すことができます。すべての非同期オブジェクトをAsyncCtrlBlock<T>クラスから継承するように設定し、フォームとすべてのコールバック デリゲートを DAL の非同期オブジェクトのコンストラクターに提供しました。

2) 現在非同期ではないプログラムの一部に再度アクセスします。2 つの呼び出しを連続して行います。最初のモデルが完成したら、モデルの一部を設定できます。2 番目の部分が完成したら、モデルの残りの部分を完成させることができますが、最初の部分がすでに完成している場合に限られます。これを構造化する最良の方法は何ですか?1回目の読み込みができて、1回目の読み込みによる処理が2回目の起動中に進行していればいいのですが、最初の読み取りデータが完了しました。

4

2 に答える 2

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 に答える
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 に答える