2017-05-19 6 views
0

Ich verwende eine API, die erwartete Objekte zurückgibt, die keine Aufgaben sind (tatsächlich sind es PendingResult Instanzen von Googles Android API). Ich möchte auf die Fertigstellung von allen warten. Aber ich kann nur eine Reihe von Aufgaben unter dem aktuellen Modell erwarten.Wie führe ich WhenAll auf einem Array von TaskAwaiters aus?

Das CTP der TPL hatte eine TaskEx.WhenAll() Erweiterung, mit der Sie auf TaskAwaiter Instanzen warten können. Aber Task.WhenAll() gilt nur für Task Instanzen. Wie kann ich WhenAll auf einem Array von TaskAwaiter Instanzen ausführen?

+0

Die [docs auf TaskAwaiter] (https://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.taskawaiter (v = vs.110) .aspx) say _ "Dieser Typ und seine Member sind für den Compiler gedacht nur."_ – stuartd

+0

Sie sind nicht dazu gedacht, diese Struktur direkt zu verwenden - warum können Sie die Aufgabe nicht stattdessen verwenden? – toadflakz

+0

Warum verwenden Sie das CTP? Das ist seit 5 Jahren obsolet. – Servy

Antwort

3

Das CTP der TPL hatte eine TaskEx.WhenAll() - Erweiterung, mit der Sie TaskAwaiter-Instanzen abwarten konnten.

Sind Sie sicher? Daran erinnere ich mich nicht. Andererseits, es war lange her, also kann ich mich einfach nicht erinnern.

Ich verwende eine Schnittstelle, die ein erwartetes Ergebnis zurückgibt, das keine Aufgabe ist. Ein erwartetes Ergebnis [das] hat eine GetTaskAwaiter() -Methode.

Wenn es eine benutzerdefinierte awaitable zurückkehren, dann können Sie nur verwenden async/await, dass zu einem Task zu konvertieren: Und Select als solche verwenden

async Task DoSomethingAsync(string parameter) => await NonTaskAsync(parameter); 

:

string[] parameters = ...; 
var tasks = parameters.Select(DoSomethingAsync); 
await Task.WhenAll(tasks); 
Verwandte Themen