オンデマンドでそれぞれの結果を処理する方法はありますか?
タスクが
を完了したときに実行されますデリゲート/コールバックを登録するようはい、あなたは自分の思考ビットを調整する必要があります。
コールバックの登録を忘れる(ContinueWith
is a dangerous, extremely low-level API)。また、完了までにタスクを注文する必要はほとんどありません。代わりに、操作(タスク)の点で問題を考えてください。
今のところ、TimeSpan
を返す一連のタスクがあります。そのコレクション内の各アイテムは、TimeSpan
を返す単一の操作です。あなたが本当にやりたいことは、元の操作が完了するのを待ってから、操作後のロジックを実行する、単一の高レベルの操作という概念を導入することです。
これがために、まさにasync
/await
です:
今
private static async Task<TimeSpan> HandleResultAsync(Task<TimeSpan> operation)
{
var result = await operation;
// A task has finished. This will get executed.
// result is of type TimeSpan
...
return result; // (assuming you want to propagate the result)
}
、既存のオペレーションにこの高レベルの操作を適用したいです。 LINQのSelect
は、このために最適です:
IEnumerable<Task<TimeSpan>> tasks = ...
IEnumerable<Task<TimeSpan>> higherLevelTasks = tasks.Select(HandleResultAsync);
TimeSpan[] results = await Task.WhenAll(higherLevelTasks);
// By the time you get here, all results have been handled individually.
あなたは結果の最後のコレクションを必要としない場合は、これをさらに簡略化することができます。
private static async Task HandleResultAsync(Task<TimeSpan> operation)
{
var result = await operation;
// A task has finished. This will get executed.
// result is of type TimeSpan
...
}
IEnumerable<Task<TimeSpan>> tasks = ...
IEnumerable<Task> higherLevelTasks = tasks.Select(HandleResultAsync);
await Task.WhenAll(higherLevelTasks);
たぶん 'タスク[i]を.ContinueWith()'? –