0

リスト内のアイテムに基づいてWCFサービスを多数呼び出す必要があるWPFアプリケーションを作成しています。

foreach(var item in items)
{
    var dataAboutItem = MethodThatCallsWCFService(item);

    //  Do work to update UI
    .
    .
    .
}

Tasks / Parallel.ForEachまたはTPLのいくつかの構造を使用してこれを行うスマートな方法はありますか?これにより、バックグラウンドスレッドですべてのサービス呼び出しを行い、呼び出しごとに結果が来るとそれに応じてUIを更新できますか?

4

2 に答える 2

1

C#5.0を使用できる場合は、async-awaitがこれを支援します。WCFサービスのコードジェネレーターはasync-awaitをサポートしているため、メソッドの非同期バージョンを生成できます。これは便利です。

あなたがすることは、すべてのリクエストを非同期的に開始し、Taskそれらが返すをコレクションに保存することです。次に、完了時にTasksを処理します。.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

于 2012-09-20T15:33:00.700 に答える
0

タスク並列ライブラリ

Parallel.ForEach

最後のサンプルにはUIがあります

データとタスクの並列処理における潜在的な落とし穴

または、UIを直接更新するのではなく、UIがバインドされているパブリックプロパティを更新します。

これでCPUがロードされない場合は、MaxDegreeOfParallelismを使用して、あまりにも多くのスレッドがスピンアップしないようにすることができます。

ParallelOptions.MaxDegreeOfParallelism

于 2012-09-19T22:32:47.420 に答える