Wie zu erwarten eine Methode in einer Linq-Abfrage
Versucht, die await
Schlüsselwort in einer LINQ
Abfrage und ich bekomme diese:
Den 'warten' - operator kann nur verwendet werden in einem Abfrage-Ausdruck in der ersten Sammlung Ausdruck der ersten " aus "- Klausel oder in der Sammlung, Ausdruck einer "join" - Klausel
Beispielcode:
var data = (from id in ids
let d = await LoadDataAsync(id)
select d);
Ist es nicht möglich zu warten, etwas in einer LINQ
Abfrage, oder muss es strukturiert werden einen anderen Weg?
Ich denke, es ist zu viel compiler magic, die hier beteiligt sind, müssen Sie die Struktur dieses anders, nur schreiben Sie es als eine normale foreach-Schleife.
InformationsquelleAutor c0D3l0g1c | 2013-05-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
LINQ hat nur eine sehr eingeschränkte Unterstützung für
async
/await
. Für LINQ-to-objects, die nur wirklich nützlich Betrieb den ich kenne ist einSelect
mit einemasync
delegieren (die Ergebnisse in eine Abfolge von Aufgaben).Wenn Sie tun können
LoadDataAsync
parallel sicher, Ihr Beispiel könnte wie folgt umgeschrieben werden:Es wäre, wenn
LoadData
ist der I/O-bound ist.Wonderfull! LoadData ist ein I/O-Verfahren.
Ich bearbeitet umbenennen
LoadData
zuLoadDataAsync
es dann macht deutlicher, dass ohne dieawait
diese Methode gibt eineTask
und als solche dieWhenAll
Methode funktioniert.Was ist so besonderes mit
Select
dass "nur wirklich nützlich Betrieb den ich kenne ist zu tun, Wählen Sie eine mit einem asynchronen delegate" im Gegensatz zuWhere
?InformationsquelleAutor Stephen Cleary
Können Sie festlegen, einige async linq-Operationen, indem Sie sich (für linq to objects):
zum Beispiel: Sie können schreiben Sie Ihre eigenen WhereAsync extension Methode:
Und wie das verwenden:
ja ich sehe, ich hasse die ConfigureAwait code litering, weiß nicht, warum das standardmäßig nicht der Kontext. Ich fest, dass.
Es ist immer noch anfällig für deadlock-es sei denn, der Benutzer verwendet immer
ConfigureAwait
innerhalb Ihrer Prädikat. Und nur verwendet Bibliotheken, die NutzungConfigureAwait
(d.h., HttpClient nicht auf einigen Plattformen).ich habe dort die Aufgabe, vor der ich Zugriff auf das Ergebnis, ich dachte, dies würde sich ändern, das Verhalten der Aufgabe.Ergebnis werden nicht blockiert. Wie kann ich erwarten, auf alle tasks und den Zugriff auf die Ergebnisse danach?
Sorry, hab ich Total verpasst, dass erste
await
. Ich noch empfehlen, dass Sie verwendenawait
zum abrufen der Ergebnisse zu vermeidenAggregateException
, aber der code hat nicht die sync-over-async-problem.InformationsquelleAutor Console
Mit reactive extensions, ist es möglich zu handhaben, die Ergebnisse einer linq-Abfrage asynchron wie diese:
Dieser ist gibt Ihnen eine beobachtbare stream können Sie reagieren auf verschiedene Weise. Zum Beispiel, Sie können dann .Puffer werden die Ergebnisse in einer Liste mit einem timeout.
Oben im wesentlichen sagt, "für jedes d in ids, gelten eine asynchrone Funktion, die die Erträge einer Aufgabe für jedes d, und behandeln Sie diese als eine beobachtbare eines individuellen Ergebnis (ToObservable), und behandeln alle diejenigen observablen zusammen als eine einzelne beobachtbare stream (Merge)
InformationsquelleAutor Sentinel