2013-07-12 14 views
13

sto cercando di fare qualcosa di simile:aspettano per la lista dei compiti

foreach (var o in ObjectList) 
{ 
    CalculateIfNeedToMakeTaskForO(o); 

    if (yes) 
     TaskList.Add(OTaskAsync()); 
} 

ora vorrei aspettare che tutti questi compiti da completare. Oltre a fare

foreach(var o in ObjectList) 
{ 
    Result.Add("result for O is: "+await OTaskAsync()); 
} 

C'è qualcosa che potevo fare? (Meglio, più elegante, più "corretto")

risposta

21

Siete alla ricerca di Task.WaitAll (supponendo che il TaskList implementato IEnumerable<Task>)

Task.WaitAll(TaskList.ToArray()); 

Edit: Dal WaitAll richiede solo una serie di attività (o una lista di Task sotto forma di array di argomenti variabili), devi convertire il tuo Enumerable. Se vuoi un metodo di estensione, puoi fare qualcosa del genere:

pulic static void WaitAll(this IEnumerable<Task> tasks) 
{ 
    Task.WaitAll(tasks.ToArray()); 
} 

TaskList.WaitAll(); 

Ma questo è veramente solo zucchero sintattico.

+0

Grazie, ma ho modificato un po 'la mia domanda per corrispondere al mio codice. Il mio problema è di registrare anche i risultati, e non solo di aspettare che finiscano. Immagino che in questo caso non ci sia altra scelta che andare in loop con l'attesa? – ctlaltdefeat

+0

@ctlaltdefeat Bene, si. Tuttavia, è possibile utilizzare LINQ per proiettare l'enumerabile. Modificherò per spiegare. –

+0

Grazie, ma non capisco comunque le cose LINQ o IEnumerable: D Scrivo solo cose che dovrebbero essere enumerabili, e di solito è – ctlaltdefeat

50

Stai cercando Task.WhenAll:

var tasks = ObjectList 
    .Where(o => CalculateIfNeedToMakeTaskForO(o)) 
    .Select(o => OTaskAsync(o)) 
    .ToArray(); 
var results = await Task.WhenAll(tasks); 
var combinedResults = results.Select(r => "result for O is: " + r); 
+0

Ehi, alcuni dei tuoi post mi hanno aiutato a iniziare con async e ad attendere, ma risulta che non ho bisogno di utilizzare nessuna delle loro funzionalità finora! – ctlaltdefeat

+0

Domanda simile a quella che ho posto sopra: nel modo in cui l'hai scritta, sembra che non accada nulla finché non sappiamo quali oggetti nella ObjectList hanno bisogno di un compito per loro, e quali no. Il mio obiettivo è che il compito per il primo oggetto (supponendo che ne abbia bisogno uno) avvenga non appena calcoliamo di averne bisogno, prima di calcolare se il secondo elemento ne ha bisogno. – ctlaltdefeat

+14

Questa è la risposta migliore poiché attende in modo asincrono il risultato. chiamando Task.WaitAll blocca il thread chiamante fino al completamento di tutte le attività –

Problemi correlati