Was ist der richtige Weg, um Linq-Typ-Methoden mit IAsyncEnumerable zu verwenden?

8

Es scheint keine Linq-Unterstützung für IAsyncEnumerable zu geben, das mit .NET Core gepackt ist. Was ist der richtige Weg, um einfache Dinge wie ToList und Count ausführen zu können?

cubesnyc
quelle
4
Wenn Sie nur ToList oder Count aufrufen möchten - was bringt es dann, eine asynchrone Enumerator-Methode zu verwenden?
stuartd
4
Warum ist das geschlossen? Das ist eine gute und klare Frage.
Stuart
3
Bitte stimmen Sie ab, um dies erneut zu öffnen. Die Frage ist absolut sinnvoll und hat, wie Sie sehen können, eine direkte Antwort
Stilgar
Danke @Stilgar, ich wusste nicht, dass das eine Sache ist Stuart
Stuart
System.Linq.Async Nuget-Paket.
Theodor Zoulias

Antworten:

7

Dies ist eine gute Frage, da es in IntelliSense praktisch keine nützlichen Elemente IAsyncEnumerable<T>mit der impliziten Framework-Referenz gibt, die Sie mit einer Standard-.NET Core-App haben würden.

Es wird erwartet, dass Sie das Paket System.Linq.Async(bekannt als Ix Async, siehe hier ) wie folgt hinzufügen :

<PackageReference Include="System.Linq.Async" Version="4.0.0" />

Dann können Sie verwenden CountAsync, oder ToListAsync:

async IAsyncEnumerable<int> Numbers()
{
    yield return 1;
    await Task.Delay(100);
    yield return 2;
}

var count = await Numbers().CountAsync();
var myList = await Numbers().ToListAsync();

Wie in einem Kommentar erwähnt, sind diese Methoden für sich genommen nicht so nützlich. Sie sollten verwendet werden, nachdem Sie die leistungsstärkeren Funktionen verwendet haben, während Ihre Daten als asynchroner Stream mit Dingen wie SelectAwaitund WhereAwaitusw. beibehalten werden.

Stuart
quelle
Die Methoden haben so wie sie sind Verwendung. Was ist, wenn mir eine API mit IAsyncEnumerable übergeben wird, deren Asynchronität mir jedoch nicht wirklich wichtig ist? Sollte ich gezwungen sein, mich selbst zu zählen (was CountAsync wahrscheinlich sowieso tut)?
Stilgar
Sie müssen sich um die Asynchronität kümmern, Sie können sich nicht abmelden, es ist das gleiche wie eine asyncMethode. Blockieren Sie es nicht, es sei denn, Sie wissen absolut, was Sie tun.
Stuart
CountAsync blockiert jedoch nicht. Sie warten nur auf die vollständige Sequenz. Wenn Sie auf jeden warten und dann in einer Variablen zählen, hat dies den gleichen Effekt.
Stilgar
Ja, ich glaube nicht, dass ich Ihren ersten Kommentar damals verstanden habe
Stuart