2016-06-24 3 views
0

Ich habe eine asynchrone Methode, die eine List<long> Komponente IDs für eine Auto-ID erhält. Ich möchte Komponenten-IDs für mehrere hundert Autos asynchron bekommen, also schrieb ich die Methode unten. Mein Ziel ist es, die Ergebnisse aller GetAllComponentIdsForCar Aufgaben zusammenzufassen und sie von der folgenden Methode zurückzugeben.C# Add-Up-Ergebnisse von Async-Methoden, wenn alle fertig sind

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 
} 

Wie bewerkstellige ich das?

Hinweis - Ich bin auf der Suche nach etwas ähnlich wie Winkel q.all, die einfach ein Array aller Aufgaben (/ Versprechen) Ergebnisse zurückgibt, wenn Sie fertig sind.

Ich habe es geschafft, Ergebnisse von asynchronen Aufgaben in C# vorher zu bekommen, aber das hat dazu geführt, ein Array die Länge der erwarteten Aufgaben zu machen, und das scheint nur ein schrecklicher Weg, es zu tun.

Ich habe versucht, Microsofts Dokumentation und Fragen hier zu lesen, aber alles, was ich sehe, sind Argumente über WaitAll vs WhenAll.

Edit:

enter image description here

Antwort

2

Wenn Sie die Deklaration von taskList geändert, um die generische Version von Task zu verwenden, Task<T>, die einen zukünftigen Wert des Typs darstellt T ...

List<Task<List<long>>> taskList 

jetzt Das Ergebnis der Aufgabe ist vom Typ List<long> anstelle von void, und die Inferenz vom Compiler-Typ führt zu einer anderen Überladung von Task.WhenAll, Task.WhenAll<TResult>(Task<TResult> tasks).

Erstellt eine Aufgabe, wenn alle der Task-Objekte in einer enumerable Sammlung

abgeschlossen

[...]

Die Task<TResult>.Result Eigenschaft des zurück Aufgabe auf ein Array wird gesetzt vervollständigen Alle Ergebnisse der gelieferten Aufgaben in der gleichen Reihenfolge wie sie geliefert wurden enthalten (zB wenn das Eingabe-Aufgaben-Array t1, t2, t3 enthielt, gibt die Eigenschaft Task<TResult>.Result der Ausgabe-Aufgabe eine TResult[] zurück, wobei arr[0] == t1.Result, arr[1] == t2.Result und arr[2] == t3.Result).

so, wie die Art der TaskList<long> ist, wird die folgende Aussage ist, wie Sie das Ergebnis-Array zusammengefasst zugreifen würde:

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

Zunächst einmal vielen Dank für die Antwort, aber es scheint zurück zu fallen (siehe Screenshot in q). – VSO

+0

Das war mein Fehler. Vielen Dank. – VSO

Verwandte Themen