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?


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

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.