2016-06-24 3 views
0

車のIDのコンポーネントIDのList<long>を取得する非同期メソッドがあります。数百台の車のコンポーネントIDを非同期に取得したいので、以下のメソッドを記述しました。私の目標は、すべてのGetAllComponentIdsForCarタスクの結果を実際に合計し、以下の方法からそれらを戻すことです。C#すべての終了時に非同期メソッドの結果を追加する

public async Task<List<long>> GetListOfComponentIds(List<long> carIds) 
{ 
    List<Task> tasksList = new List<Task>(); 

    foreach (var carId in carIds) 
    { 
     Task<List<long>> getComponentIds = GetAllComponentIdsForCar(carId); 
     tasksList.Add(getComponentIds); 
    } 

    await Task.WhenAll(tasksList); 

    //List<long> sumOfAllTaskResults...or array...or something 
} 

これはどのようにして達成できますか?

注 - 私はangleのq.allに似たものを探しています。これは、完了したらすべてのタスク(/ promise)結果の配列を返します。

私はC#で非同期タスクの結果を得ることができましたが、それは予想されるタスクの長さを配列にすることを含み、それは恐ろしい方法です。

ここでMicrosoftのドキュメントと質問を読んでみましたが、私にはWaitAllとWhenAllの違いについての議論があります。

編集:

List<Task<List<long>>> taskList 

今あなたがTask、タイプTの将来価値を表しTask<T>のジェネリック版を使用するtaskListの宣言を変更した場合

enter image description here

答えて

2

...タスクの結果はvoidではなくList<long>であり、コンパイラのタイプの推論によって異なるオーバーロードに切り替わりますTask.WhenAll,Task.WhenAll<TResult>(Task<TResult> tasks)である。

返されたタスクのTask<TResult>.Resultプロパティが配列に設定されます列挙コレクション内のTaskオブジェクトのすべてが

を完了したときに完了するタスク[...]

を作成します。 (たとえば入力タスク配列にt1, t2, t3が含まれている場合、出力タスクのTask<TResult>.ResultプロパティはTResult[]arr[0] == t1.Result, arr[1] == t2.Resultおよびarr[2] == t3.Result)を返します)。

TaskのタイプはList<long>であるように、次の文を使用すると、照合結果の配列にアクセスしたい方法です:

List<Long>[] resultLists = await Task.WhenAll(tasksList); 
+0

まず、返事をどうもありがとうございましたが、それ無効になっているようです(qのスクリーンショットを参照)。 – VSO

+0

それは私の間違いでした。どうもありがとうございました。 – VSO

関連する問題