2014-11-10 11 views
6

Mamy nadzieję, że jest to dość proste. Mam kolekcję obiektów, z których każdy ma metodę asynchroniczną, z którą chcę się połączyć i odbierz wartości. Chciałbym, żeby biegły równolegle. To, co chciałbym osiągnąć, można podsumować w jednym przerywanym wierszu kodu:Uzyskiwanie wartości zwracanych z Task.WhenAll

IEnumerable<TestResult> results = await Task.WhenAll(myCollection.Select(v => v.TestAsync())); 

Próbowałem różnych sposobów pisania tego bez powodzenia. jakieś pomysły?

+1

Jak 'TestAsync' wyglądają? – i3arnon

+2

Ten wiersz kodu wygląda OK. Co nie działa dokładnie? Dowolny błąd kompilatora, wyjątek czasu wykonywania itp.? – Dennis

+0

Domyślam się, że jego sygnatura 'TestAsync()' wyglądała następująco: 'public async TestResult TestAsync()', zamiast 'public async Task TestAsync()'. –

Odpowiedz

9

Jeśli zadania, na które czekasz, mają wynik tego samego typu, Task.WhenAll zwraca ich tablicę. Na przykład dla tej klasy:

public class Test 
{ 
    public async Task<TestResult> TestAsync() 
    { 
     await Task.Delay(1000); // Imagine an I/O operation. 
     return new TestResult(); 
    } 
} 

Dostajemy te wyniki:

var myCollection = new List<Test>(); 
myCollection.Add(new Test()); 

IEnumerable<TestResult> results = await Task.WhenAll(myCollection.Select(v => v.TestAsync())); 
+3

@ I3arnon: jest to ten sam kod, który OP napisał. Lepiej wyjaśnić, co dla niego nie działa. – Dennis

+0

Wyjaśniłem, co powinno działać i dlaczego. Czekam, aż OP wyjaśni, co dla niego nie działa. – i3arnon

+3

Jestem idiotą - Moja metoda TestAsync zwróciła zadanie zamiast zadania - jak tylko to zmieniłem, zadziałało. Dzięki za wskazanie mi w dobrym kierunku - nie mogłem zobaczyć, co było nie tak, nawet jeśli było przede mną! – wwarby

Powiązane problemy