Asynchrone lambda-Ausdruck mit warten Renditen Aufgabe?
Ich habe den folgenden code:
//Get all of the files from the local storage directory.
var files = await folder.GetFilesAsync();
//Map each file to a stream corresponding to that file.
var streams = files.Select(async f => { return await f.OpenStreamForWriteAsync(); });
Ich würde erwarten, dass streams
Typ IEnumerable<Stream>
aber in der Tat ist es der IEnumberable<Task<Stream>>
, das ist, was ich zu erwarten haben, hatte ich die weggelassen await-Schlüsselwort. Der Rückgabetyp OpenStreamForWriteAsync
ist Task<Stream>
— sicherlich erwartet es sollte einen Stream
?
So, warum ist der return await-Anweisung Rückkehr eine Aufgabe?
Vielen Dank für Ihre Hilfe.
async-Methoden immer wieder
Gut, man kann schreiben "async void" - Methode, die ist, was ich vermutete, war hier passiert. Wie kann ich es beheben?
OK werde ich mal versuchen.
Was vscjones wohl gemeint ist, dass jederzeit eine nicht-
Task<T>
oder Task
. Wählen Sie selbst kümmert sich nicht um die Rückgabe geben. Damit it-Projekte eine zählbare Aufgabe, da die select-lambda ist async. Man könnte die Iteration über Ihre Sammlung und warten auf den Stream.Gut, man kann schreiben "async void" - Methode, die ist, was ich vermutete, war hier passiert. Wie kann ich es beheben?
OK werde ich mal versuchen.
Was vscjones wohl gemeint ist, dass jederzeit eine nicht-
async
Methode, die void zurückgibt und verwandeln Sie es in eine async
Methode solltest du ändern, es ist Rückgabetyp von void
zu Task
, weil Task
ist eine Möglichkeit für den Anrufer, zu wissen, wenn es fertig ist, aber gibt es nicht ein Ergebnis. Rückkehr void
nur bedeutet, der Anrufer kann nicht einmal wissen, Wann es endet.why is the return await statement returning a Task?
I +1 ' ed Servy Antwort, aber um es einfach zu sagen: await
packt ein Task<T>
zu einem T
, und async
umschließt die T
zurück in Task<T>
.InformationsquelleAutor Matthew H | 2012-12-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Alle
async
Methoden zurück, entwedervoid
,Task
oderTask<TResult>
. Die lambda ist nur eine anonyme Methode, und damit, dass immer noch gilt. Es ist im wesentlichen die gleiche wie diese Methode mit dem Namen:Um es wieder ein
Stream
würde es brauchen, um eine blockierende Methode, als vielmehr um eine async-Methode:Werden Sie wahrscheinlich nicht wollen, dass.
Können Sie Ihre
IEnumerable<Task<Stream>>
in eineTask<Stream[]>
mithilfeTask.WhenAll
wenn dir das hilft:var streams = files.Select(await f.OpenStreamForWriteAsync());
. Es ist nicht die lambda muss, dass die async-Modifizierer.InformationsquelleAutor Servy
Wäre dies die beste Lösung sein?
InformationsquelleAutor Erik83