タスクベースの非同期パターンについて読んだことがありますが、それは素晴らしいですね。これで、他のWCFサービスを呼び出す必要があるWCFサービスがあります。これらのサービスは異なる結果を返します。非同期でこれらのサービスを新しいパターンで呼び出し、すべてが完了するのを待つにはどうすればよいですか?
3 に答える
編集:BeginXXXメソッドとEndXXXメソッドを使用している場合は、これらをタスクに変換する方法についてこの質問を参照してください。そうすれば、残りの回答が適用されます。Task<T>
基本的に、あなたは必要TaskFactory<T>.FromAsync(...)
です。
を使用できますがTaskEx.WhenAll
、最終的にはになりますTask.WhenAll
。
早期にエラーが発生した場合でも、これによりすべてのタスクが終了するのを待つことに注意してください。
タスクにはさまざまな結果タイプがあるため、最初にタスクを設定し、すべてが完了するのを待ってから、結果を取得する必要があります。
var t1 = service1.DoFirstTaskAsync();
var t2 = service2.DoSecondTaskAsync();
var t3 = service3.DoThirdTaskAsync();
await TaskEx.WhenAll(t1, t2, t3);
var result1 = t1.Result;
var result2 = t2.Result;
var result3 = t3.Result;
// Use the results
または、最初にタスクを実行して、それぞれを個別に待ちます。TAPのタスクは「ホット」であることに注意してください。タスクは、待機するときではなく、作成するとすぐに開始されます。したがって、これも機能しますが、今回t1
は例外をスローした場合、次のように待機して完了することはありません。t2
t3
var t1 = service1.DoFirstTaskAsync();
var t2 = service2.DoSecondTaskAsync();
var t3 = service3.DoThirdTaskAsync();
var result1 = await t1;
var result2 = await t2;
var result3 = await t3;
// Use the results
私はこれについてブログを書きました。最初は一般的に複数のタスクを待つことについて、次に複数のタスクを待つときの例外についてです。
非同期CTPを参照してください-非同期/待機を使用してwcfサービスを呼び出すにはどうすればよいですか?
非同期クライアントとサービスの例。または、AsyncWcfLibを使用します。これは、アクターベースのプログラミングモデルをサポートし、アプリケーション内またはネットワークを介して他のサービスを呼び出すサービスの例があります。