C#5.0を使用できる場合は、async
-await
がこれを支援します。WCFサービスのコードジェネレーターはasync
-await
をサポートしているため、メソッドの非同期バージョンを生成できます。これは便利です。
あなたがすることは、すべてのリクエストを非同期的に開始し、Task
それらが返すをコレクションに保存することです。次に、完了時にTask
sを処理します。.Netはそのままではサポートしていませんが、StephenToubのInterleaved()
方法を使用できます。
var tasks = new List<Task<DataAboutItem>>();
foreach (var item in items)
{
// don't await here yet
Task<DataAboutItem> dataAboutItemTask = MethodThatCallsWCFServiceAsync(item);
tasks.Add(dataAboutItemTask);
}
foreach (var bucket in Interleaved(tasks))
{
var dataAboutItemTask = await bucket;
DataAboutItem dataAboutItem = await dataAboutItemTask;
// Do work to update UI
}
WCFサービスの呼び出しを抑制したい場合(たとえば、一度に10個の要求のみを行う場合)、代わりにTPLDataflowを使用して。を指定できますMaxDegreeOfParallelism
。