2014-11-10 16 views
6

Speriamo che sia abbastanza semplice qui. Ho una collezione di oggetti, ognuno dei quali ha un metodo asincrono che voglio chiamare e raccogliere valori da. Mi piacerebbe che funzionassero in parallelo. Quello che mi piacerebbe raggiungere può essere riassunta in una linea spezzata di codice:Ottenere i valori di ritorno da Task.WhenAll

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

Ho provato diversi modi di scrivere questo senza successo. qualche idea?

+1

Come funziona 'TestAsync' guardare? – i3arnon

+2

Questa riga di codice sembra OK. Cosa non funziona esattamente? Qualche errore del compilatore, eccezione di run-time, ecc.? – Dennis

+0

Credo che la sua firma 'TestAsync()' assomigliò a questa: 'public async TestResult TestAsync()', invece di 'public async Task TestAsync()'. –

risposta

9

Se le attività che si sono in attesa hanno un risultato dello stesso tipo, Task.WhenAll restituisce un array di esse. Per esempio per questa classe:

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

Otteniamo questi risultati:

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

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

@ I3arnon: questo è lo stesso codice, che OP aveva scritto. È meglio chiarire, cosa non funziona per lui. – Dennis

+0

Ho spiegato cosa dovrebbe funzionare e perché. Sto aspettando che l'OP chiarisca cosa non funziona per lui. – i3arnon

+3

Sono un idiota: il mio metodo TestAsync restituiva un'attività piuttosto che un'attività - non appena l'ho modificato, funzionava. Grazie per avermi indicato nella giusta direzione: non ho potuto vedere cosa fosse sbagliato anche se era di fronte a me! – wwarby

Problemi correlati