Qual é a maneira correta de usar métodos do tipo linq com IAsyncEnumerable?

8

Parece não haver nenhum suporte linq incluído para IAsyncEnumerable empacotado com o .NET Core. Qual é a maneira correta de ser capaz de fazer coisas simples, como ToList e Count?

cubesnyc
fonte
4
Se você quiser chamar ToList ou Count - qual é o sentido de usar um método de enumerador assíncrono?
stuartd
4
Por que isso está fechado? É uma pergunta boa e clara.
Stuart
3
Por favor vote para reabrir esta questão faz sentido perfeito e como você pode ver que tem resposta simples
Stilgar
Graças @Stilgar, eu não sabia que era uma coisa 🙂
Stuart
Pacote System.Linq.Async Nuget.
Theodor Zoulias 27/11/19

Respostas:

7

Essa é uma boa pergunta, pois quase não há itens úteis no IntelliSense prontos IAsyncEnumerable<T>para uso com a referência implícita da estrutura que você teria com um aplicativo .NET Core padrão.

Espera-se que você adicione o pacote System.Linq.Async(conhecido como Ix Async, veja aqui ) assim:

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

Então você pode usar CountAsync, ou 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();

Como apontado em um comentário, esses métodos não são tão úteis por si só, eles devem ser usados ​​depois que você usar os recursos mais poderosos, mantendo seus dados como um fluxo assíncrono, com coisas como SelectAwaite WhereAwaitetc ...

Stuart
fonte
Os métodos têm usos como estão. E se eu receber uma API IAsyncEnumerable, mas eu realmente não me importo com a asyncness dela? Devo ser forçado a me contar (o que provavelmente é o que o CountAsync faz de qualquer maneira)?
Stilgar
Você precisa se preocupar com a assíncrona, não pode optar por não participar, é o mesmo que um asyncmétodo. Não bloqueie, a menos que você saiba absolutamente o que está fazendo.
Stuart
Mas o CountAsync não está bloqueando. Você está apenas aguardando a sequência completa. Se você aguardar foreach e depois contar em uma variável, isso terá o mesmo efeito.
Stilgar
Sim, seria, eu não acho que eu entendi o seu primeiro comentário depois
Stuart